2 votes

Comment lire et mettre à jour plusieurs fichiers

J'ai 10 fichiers txt dans Debug\Tests\Text\ (10 fichiers txt). Je dois écrire un programme pour ouvrir les 10 fichiers et les mettre à jour un par un. Je ne suis pas sûr comment faire. À présent, je lis effectivement le dossier et obtiens le nom du fichier que je stocke dans un tableau. Voici mon code :

private void getFilesName()
{
    string[] fileArray = Directory.GetFiles(@"Tests\Text");

    // parcourir le dossier et obtenir les noms de fichiers
    for (int i = 0; i

`Après cela, il lit bien tous les noms de fichiers texte, mais le défi maintenant est pour moi d'accéder au nom de fichier et de mettre à jour chaque fichier. J'ai également créé une autre méthode juste pour mettre à jour les valeurs dans les fichiers txt, voici le code :

private bool modifySQLFile()
{
    string destFileName = @"Tests\Text\" // J'ai besoin du nom de fichier? 
    string[] fileTexts = File.ReadAllLines(destFileName);
    int counter = 0;

    // Traitement du fichier
    foreach(string line in fileTexts)
    {
        // lire seulement les lignes non commentées
        if(line.StartsWith("--") == false)
        {
            // Commencer à remplacer les instances de ID d'accès
            if(line.Contains(Variable) == true)
            {
                fileTexts[counter] = fileTexts[counter].Replace(Variable, textBox2.Text);
            }
        }
        counter++;
    }

    // vérifier si le fichier existe dans le dossier de sauvegarde
    if(File.Exists("Tests\\Text\\nom du fichier "+ textBox1.Text +".sql") == true)
    {
        MessageBox.Show("Ce fichier existe déjà dans le dossier de sauvegarde");
        return false;
    }

    else
    {
        // mettre à jour le fichier
        File.WriteAllLines(destFileName, fileTexts);
        File.Move(destFileName, "Tests\\Text\\nom du fichier"+ textBox1.Text +".sql");
        MessageBox.Show("Terminé");
        return true;
    }
}`

1voto

CodeCaster Points 38181

Votre problème semble être de passer la variable du nom de fichier de la boucle à la méthode.

Pour faire ce que vous voulez, ajoutez un paramètre à la méthode :

private bool ModifySQLFile(string filename)
{
    string[] fileTexts = File.ReadAllLines(filename);

    // ...
}

Ensuite, appelez la méthode avec ce paramètre :

for (int i = 0; i

`

Mais en général, vous ne voulez vraiment pas traiter un langage formel comme du texte brut comme vous le faites. Il est très facile de casser le SQL de cette manière. Que se passerait-il si l'utilisateur voulait remplacer le texte "insert" ou remplace quelque chose par "foo'bar" ?

`

1voto

Dmitry Bychenko Points 17719

Tout d'abord, mettez en œuvre une modification (file) :

private bool modifySQLFile(String file) {
  // étant donné le fichier source, élaborons le nom du fichier cible
  String targetFile = Path.Combine(
    Path.GetDirectoryName(file),
    String.Format("{0}{1}.sql", 
      Path.GetFileNameWithoutExtension(file), 
      textBox1.Text));

  // Au cas où vous voulez une sauvegarde
  //TODO: étant donné le nom du fichier source, élaborer le nom du fichier de sauvegarde
  //String backUpFile = Path.Combine(...); 

  // Vérifiez (validez) avant de traiter : ne pas écraser les fichiers existants
  if (File.Exists(targetFile)) 
    return false;

  //TODO: que faire si le fichier de sauvegarde existe ? Devrions-nous l'écraser ? le sauter ? 

  // si la ligne ne commence pas par un commentaire SQL -- 
  // et contient une variable, substituer la variable par sa valeur 
  var target = File
    .ReadLines(file)
    .Select(line => (!line.StartsWith("--") && line.Contains(Variable)) 
       ? line.Replace(Variable, textBox2.Text)
       : line);

  // écrivez les lignes modifiées ci-dessus dans le fichier
  File.WriteAllLines(targetFile, target);

  // Au cas où vous voulez une sauvegarde
  // Déplacer le fichier vers la sauvegarde
  //File.Move(file, backUpFile); 

  return true;  
}

Ensuite, appelez-la dans la boucle :

  // énumérer tous les fichiers texte dans le répertoire
  var files = Directory
    .EnumerateFiles(@"Tests\Text", "*.txt");
    //TODO: vous voudrez peut-être filtrer certains fichiers avec .Where
    //.Where(file => ...);

  // mettre à jour tous les fichiers trouvés ci-dessus
  foreach (var file in files) {
    if (!modifySQLFile(file))
       MessageBox.Show(String.Format("{0} déjà existant dans le dossier de sauvegarde", file));
  }

S'il vous plaît, ne faites pas :

  • Utilisez des valeurs magiques : qu'est-ce que @"Tests\Text\" dans votre modifySQLFile
  • Mélangez l'interface utilisateur MessageBox.Show(...) et la logique : modifySQLFile renvoie true ou false et c'est son appelant qui peut afficher la boîte de message.
  • Matérialiser quand ce n'est pas nécessaire (Directory.GetFiles, File.ReadAllLines)

-1voto

Thomas Christof Points 280

Si vous souhaitez modifier les fichiers en parallèle. Avec des threads, vous pouvez paralléliser le travail.

    for (int i = 0; i < fileArray.Length; i++)
        new Thread(UpdateFileThread).Start(fileArray[i]);

    private void UpdateFileThread(object path)
    {
        string filePath = (string)path;
        //ToDo: Modifier le fichier
    }

Dans votre cas, vous créeriez 10 threads. Cette solution fonctionne, mais c'est un mauvais pattern si vous devez traiter plus de 10 fichiers.

-2voto

Karthik Elumalai Points 1286

Ci-dessous, j'ai posté le code en temps réel que j'ai utilisé dans le projet

protected void btnSqlfinder_Click(object sender, EventArgs e)  
{  
    // Définition du chemin du répertoire où tous les fichiers sont enregistrés  
    string filepath = @ "D:\TPMS\App_Code\";  
    // obtenir tous les noms de fichiers à l'intérieur du répertoire  
    string[] files = Directory.GetFiles(filepath);  
    // parcourir les fichiers pour rechercher un fichier à la fois   
    for (int i = 0; i < files.Length; i++)  
    {  
        string sourcefilename = files[i];  
        StreamReader sr = File.OpenText(sourcefilename);  
        string sourceline = "";  
        int lineno = 0;  
        while ((sourceline = sr.ReadLine()) != null)  
        {  
            lineno++;  
            // définition du mot-clé de recherche  
            if (sourceline.Contains("from"))  
            {  
                // ajouter le résultat à la zone de texte multiligne  
                TxtResult.Text += sourcefilename + lineno.ToString() + sourceline + System.Environment.NewLine;  
            }  
            if (sourceline.Contains("into"))  
            {  
                TxtResult.Text += sourcefilename + lineno.ToString() + sourceline + System.Environment.NewLine;  
            }  
            if (sourceline.Contains("set"))  
            {  
                TxtResult.Text += sourcefilename + lineno.ToString() + sourceline + System.Environment.NewLine;  
            }  
            if (sourceline.Contains("delete"))  
            {  
                TxtResult.Text += sourcefilename + lineno.ToString() + sourceline + System.Environment.NewLine;  
            }  
        }  
    }  
}  

Ce code récupérera les fichiers multiples dans le répertoire donné et affichera les lignes selon le mot-clé dans un texte séparé.

Mais vous pouvez facilement modifier selon vos besoins, veuillez me faire part de vos réflexions.

Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X