Faire une Base de données de fichier

Signaler
Messages postés
224
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
24 juillet 2013
-
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-
Bonjour

Voila j'ai fait un programme qui permet de lister des fichiers contenu dans des disques dur.

Mon logiciel est fini mais j'ai utilisé des fichiers textes qui s'enregistraient sur le disque dur en question.

Maintenant j'aimerais faire cela mais directement sur des bases de données

Cependant j'ai deux choses a faire.

J'aimerais que la base de donnée propre au disque dur soit enregistré sur ce disque dur a la racine. Pour l'emplacement pas de soucis, mais pour la création d'une base de donnée directement dans le code C#, je sais pas trop comment faire.

Et la seconde épreuve est de faire une base de donnée sur le disque local du pc (c:), faire une base de donnée qui reprend les élément de tout les disque dur( avec champ disque dur pour retrouver sur quel disque cela se trouve)

Mais j'aimerais également ne pas toucher au champ qui sont deja present dans la base de donnée sauf si y a une modification du genre de fichier

merci pour votre aide et vos pistes.

8 réponses

Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
bonsoir

tout dépend de la base que tu veux utiliser,
voici un petit exemple pour Sql serveur

D'abord la création de la base:
// creation d'une base de donnée à la racine d'un  disque donné
private void CreateDatabase(string databaseName, string location)
{
string CreateStatement = @" CREATE DATABASE {0}
ON ( NAME '{0}_dat',FILENAME '{1}:\{0}.mdf',SIZE = 10,MAXSIZE = 50,FILEGROWTH = 5 )
LOG ON( NAME '{0}_log',FILENAME '{1}:\{0}.ldf',SIZE = 5MB,MAXSIZE = 25MB,FILEGROWTH = 5MB )";
SqlConnection connection = new SqlConnection("data source=(local);initial catalog=master;Integrated Security=true;");
SqlCommand CreateCommand = new SqlCommand(string.Format(CreateStatement,databaseName,location), connection);
try
{
connection.Open();
CreateCommand.ExecuteNonQuery();
}
catch (SqlException sqlEx)
{
MessageBox.Show(sqlEx.ToString(), "Erreur création database");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Erreur création database");
}
finally
{
connection.Close();
}
}

Ensuite il faute y créer une table

//Création d'une table FileList indexée sur le fullname du fichier
private void CreateTable(string databaseName)
{
string CreateStatement = @"CREATE TABLE [dbo].[FileList] 
(
[fullPath] [varchar] (500) COLLATE French_CI_AS NOT NULL ,
[Type] [varchar] (50) COLLATE French_CI_AS NULL ,
[size] [bigint] NULL ,
[LastWriteTime] [datetime] NULL,
[CreationDate] [datetime] NULL 
) ON [PRIMARY]";
string SetIndexStatement = @"	ALTER TABLE [dbo].[FileList] 
ADD CONSTRAINT [PK_FileList] PRIMARY KEY  CLUSTERED 
(
[fullPath]
)  ON [PRIMARY]";
SqlConnection connection = new SqlConnection(string.Format("data source=(local);initial catalog={0};Integrated Security=true;", databaseName));
SqlCommand CreateCommand = new SqlCommand(string.Format(CreateStatement), connection);
SqlCommand SetIndexCommand = new SqlCommand(string.Format(SetIndexStatement), connection);
try
{
connection.Open();
CreateCommand.ExecuteNonQuery();
SetIndexCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Erreur création table");
}
finally
{
connection.Close();
}
}


et enfin y inserer des données, ou les mettre à jour si elles existent déjà.
pour le controle d'existence, je ne me suis pas embêté, je considere l'exception sur l'insertion comme test, il faudrait changer ça.
//insertion d'une liste de fichier dans la table FileList, mise à jour des infos LastWriteTime et taille si existant
private void InsertDiskInfo(List<string> fileList, string databaseName)
{
string insertQuery = @"INSERT INTO FileList (fullPath, [type], [size], CreationDate, LastWriteTime)
VALUES(@fullPath, @fileType, @fileSize, @creationDate, @LastWriteTime)";
string UpdateQuery = @"UPDATE FileList 
SET 
LastWriteTime =  @LastWriteTime,
[size] = @fileSize 
WHERE (fullPath = @fullPath)";

SqlConnection connection = new SqlConnection(string.Format("data source=(local);initial catalog={0};Integrated Security=true;", databaseName));
SqlCommand InsertCommand = new SqlCommand(insertQuery, connection);
SqlCommand UpdateCommand = new SqlCommand(UpdateQuery, connection);
try
{
connection.Open();
foreach (string file in fileList)
{
InsertCommand.Parameters.Clear();
FileInfo fileInfo = new FileInfo(file);
if ((fileInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
{
DirectoryInfo dirInfo = new DirectoryInfo(file);
InsertCommand.Parameters.AddWithValue("@fileType", "Directory");
InsertCommand.Parameters.AddWithValue("@fullPath", dirInfo.FullName);
InsertCommand.Parameters.AddWithValue("@fileSize", 0);
InsertCommand.Parameters.AddWithValue("@creationDate", dirInfo.CreationTime);
InsertCommand.Parameters.AddWithValue("@LastWriteTime", dirInfo.LastWriteTime);
}
else
{
InsertCommand.Parameters.AddWithValue("@fileType", "File");
InsertCommand.Parameters.AddWithValue("@fullPath", fileInfo.FullName);
InsertCommand.Parameters.AddWithValue("@fileSize", fileInfo.Length);
InsertCommand.Parameters.AddWithValue("@creationDate", fileInfo.CreationTime);
InsertCommand.Parameters.AddWithValue("@LastWriteTime", fileInfo.LastWriteTime);
}
try
{
InsertCommand.ExecuteNonQuery();
}
catch
{ // existe déjà? test un update
try
{
UpdateCommand.Parameters.Clear();
if ((fileInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
{
DirectoryInfo dirInfo = new DirectoryInfo(file);
UpdateCommand.Parameters.AddWithValue("@fullPath", dirInfo.FullName);
UpdateCommand.Parameters.AddWithValue("@fileSize", 0);
UpdateCommand.Parameters.AddWithValue("@LastWriteTime", dirInfo.LastWriteTime);

}
else
{
UpdateCommand.Parameters.AddWithValue("@fullPath", fileInfo.FullName);
UpdateCommand.Parameters.AddWithValue("@fileSize", fileInfo.Length);
UpdateCommand.Parameters.AddWithValue("@LastWriteTime", fileInfo.LastWriteTime);

}
UpdateCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Erreur insertion file");
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Erreur insertion file");
}
finally
{
connection.Close();
}

}


en esperant que cela t'aide.

Bon code
Bob
C# is amazing, enjoy it!
Messages postés
224
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
24 juillet 2013

Merci pour ton aide. Je viens de rentrer donc je vais tester apres cela.

Au fait moi mes donné sont mi dans un datagridview avant l'envoie sur la base de donnée.

Donc cela devrai me faciliter la tache, non?
Messages postés
224
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
24 juillet 2013

Au fait

est-il possible d'utiliser une base de donner sans pour autant passé par sql server ou autre.

J'aimerai juste que mon application puisse acceder et ouvrir cette base de donnée
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Bonjour

si tu veux une base de donnée, il te faut obligatoirement un moteur, tu peux utiliser SQL 2008 Express il est gratuit.
si non tu peux utiliser un fichier XML, que tu charges en mémoire avec un dataset, ou en utilisant Linq, pour des tables simples c'est assez éfficace.

Bob
C# is amazing, enjoy it!
Messages postés
224
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
24 juillet 2013

en fait c'est des table tres simple.

3tables avec
-une table pour les genre de film (horreur, action, aventure,...)
-une table type avec film, dessin animé, série
-une table pour les fichiers proprement dit (titre, taille, type(reference a la table type), genre(reference a la table genre)

et pour labase de donné qui reste sur le pc, j ajoute une table disque avec les info du disque dur (numéro de serie, label)

Pour ce genre de base de donnée, tu me conseils quel système?
Et avec sql server, si j'utilise cela, les gens qui utiliseront mon programme devront l'avoir?
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Bonsoir

oui, si tu utilise une base de données, quelle quelle soit, il faudra que les utilisateurs l'installe.
pour ton cas, tu peux utiliser du XML

Dans le début du post, tu dis utiliser un DataDridView, donc un DataGrid
dans ce cas tu peux le charger directement à partir d'un XML, et également suavegarder son contenu:
ex:
			try
{
// rechargement d'une base existante
if (File.Exists("c:\\test.xml"))
{
Dataset objDataSetTemp = new Dataset();
objDataSetTemp.ReadXml("c:\\test.xml");
DataGrid1.DataSource = null;
objDataset.Clear();
objDataset.Merge(objDataSetTemp);
DataGrid1.SetDataBinding(objDataset, "DISK_FILE");

}
else // charger la base à partir 
FillMyDatagrid();

// ensuite on regerere la base sur le dique
if (File.Exists("c:\\test.xml"))
File.Delete("c:\\test.xml");
((Dataset)DataGrid1.DataSource).WriteXml("c:\\test.xml"); 

}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}




C# is amazing, enjoy it!
Messages postés
224
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
24 juillet 2013

Mais ca reviendrai au même que mon fichier texte, non?

ou ca facilite la recherche?

on m'a parler de sql server ce aussi. mais je suppose qu il faut aussi installer le server sur le pc
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Salut

SQL CE est en effet une solution, depuis la version 3.5 il existe une release Desktop qui tourne sur PC.
mais oui, il faudra installer SQL CE sur les machines ou tournera ton programme.

Le XML est en effet un fichier texte, mais organisé, ce qui permet de la manipuler comme une base de donnée.
Le XML peut être composé d'un schéma et de données, qui peuvent par ailleurs être dans des fichiers séparés.
Dans le schéma on peut définir des formats de tables, avec des relations comme une base de données.
Les DataGrid peuvent gérées les XML comme source de données directement.
On peut aussi manipuler les XML avec des datasets, comme une base de données
il y a aussi LinqToXml, pour faire des requêtes (ajout, modification suppression) sur les données.
L'avantage du XML c'est qu'il ne nécessite pas d'installation particulière, c'est géré par la plateforme .net


C# is amazing, enjoy it!