2017-02-23 1 views
0

J'ai deux méthodes: saveFile et saveAsToFile. Le premier est censé écraser le contenu du fichier existant. Alors que le second est censé enregistrer en tant que nouveau fichier (si le courant est inexistant ou l'utilisateur veut juste faire une copie.)C# Remplacer le fichier texte - rien n'est écrit dans le fichier

Lorsque j'utilise la méthode saveAsToFile, cela fonctionne à chaque fois. Lorsque j'utilise la méthode saveFile, il n'écrit rien. (Je ne vois MessageBox "Saved!", Bien que.)

Voici mes méthodes:

public void saveFile(string[] inData, string inDataTitle) 
    { 
     //This method saves the file 
     SaveFileDialog savefile; 
     string trueFileName; 

     if (isStrArrayNotEmpty(inData)) { 
      //Only attempt to save the file if there is anything written in the textArea 

      if (f.getDocumentSavedStatus()) { 
       if (f.getDocumentChangedStatus()) { 
        savefile = new SaveFileDialog(); 

        if (inDataTitle.EndsWith("*")) { 
         //Remove the asterisk from the document name 

         savefile.FileName = inDataTitle.Substring(0, inDataTitle.Length - 1); 
        } 
        else { 
         savefile.FileName = inDataTitle; 
        } 

        StreamWriter sw = new StreamWriter(savefile.FileName, false); 
        foreach (string line in inData) { 
         sw.WriteLine(line); 
        } 
        sw.Flush(); 
        if (sw.BaseStream != null) 
         sw.BaseStream.Flush(); 
        sw.Close(); 

        /* 
        using (StreamWriter sw = new StreamWriter(savefile.FileName, false)) 
         foreach (string line in inData) { 
          sw.WriteLine(line); 
         } 
        */ 

        f.setDocumentName(string.Empty); 
        trueFileName = Path.GetFileName(savefile.FileName); 
        f.setDocumentName(trueFileName); 
        f.setDocumentSavedStatus(true); 
        f.setDocumentChangedStatus(false);  //Changes saved, status updated 

        MessageBox.Show("Saved!"); 
       } 
      } 
      else { 
       //If the document hasn't been saved before, send the values to the 'Save As' method 

       saveAsToFile(inData, inDataTitle); 
      } 
     } 
    } 

    public void saveAsToFile(string[] inData, string inDataTitle) 
    { 
     //This method checks if there is anything written in the texArea, 
     //if so it prompts the user to save the file to disk (Save As) 

     SaveFileDialog savefile; 
     string trueFileName; 

     if (isStrArrayNotEmpty(inData)) { 
      //Only attempt to save the file if there is anything written in the textArea 

      savefile = new SaveFileDialog(); 

      if (inDataTitle.EndsWith("*")) { 
       //Remove the asterisk from the document name 

       savefile.FileName = inDataTitle.Substring(0, inDataTitle.Length - 1); 
      } 
      else { 
       savefile.FileName = inDataTitle; 
      } 

      savefile.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"; 

      if (savefile.ShowDialog() == DialogResult.OK) { 
       StreamWriter sw = new StreamWriter(savefile.FileName, false); 
       foreach (string line in inData) { 
        sw.WriteLine(line); 
       } 
       sw.Flush(); 
       if (sw.BaseStream != null) 
        sw.BaseStream.Flush(); 
       sw.Close(); 


       /* 
       using (StreamWriter sw = new StreamWriter(savefile.FileName)) 
        foreach (string line in inData) { 
         sw.WriteLine(line); 
        } 
       */ 

       f.setDocumentName(string.Empty); 
       trueFileName = Path.GetFileName(savefile.FileName); 
       f.setDocumentName(trueFileName); 
       f.setDocumentSavedStatus(true); 
       f.setDocumentChangedStatus(false);  //Changes saved, status updated 
      } 
     } 
    } 

Comme vous pouvez le voir par les commentaires dans le code; J'ai essayé d'utiliser using, puis j'ai essayé de "vider manuellement" le streamwriter, mais rien ne fonctionne. Le saveAsToFile fonctionne à chaque fois. Il écrase le fichier texte comme prévu, pas de problèmes. Alors que saveFile n'écrit rien dans le fichier. (Laissant inchangé.)

J'ai essayé la recherche d'erreurs dans saveFile en utilisant MessageBox.Show pour imprimer les valeurs de savefile.Filename et line dans les endroits appropriés - ils ont tous travaillé comme prévu, mais rien est écrit dans le fichier texte actuel.

isStrArrayNotEmpty renvoie true si le tableau de chaînes ne contient aucun espace blanc. getDocumentSavedStatus renvoie la valeur d'un boolean qui indique si le fichier a été enregistré avant ou non (inexistante/inexistante) getDocumentChangedStatus renvoie la valeur d'un boolean qui indique si le fichier a été modifié ou non (astérisque à la fin de le nom du fichier, ce qui indique que le travail sera perdue si l'utilisateur ferme l'application.)

+0

Je vous recommande d'utiliser le débogueur Visual Studio. Et passer du temps à analyser votre code. –

Répondre

1

Le paramètre inDataTitle inclut-il le chemin du nom de fichier que vous essayez d'enregistrer? Si ce n'est pas le cas, il est probable que vous enregistriez dans un fichier du même nom mais dans un dossier différent.

Après votre ligne: -

StreamWriter sw = new StreamWriter(savefile.FileName, false); 

ajouter la ligne: -

MessageBox.Show(((FileStream)(sw.BaseStream)).Name); 

et il vous dira où le fichier est en cours d'enregistrement.

+0

Vous avez raison. Le chemin manquait!Je vais essayer de réécrire mon code maintenant (j'essaie actuellement de fusionner les deux méthodes en une seule.) Merci. =) –

0

Essayez de remplacer

StreamWriter sw = new StreamWriter(savefile.FileName, false); 
    foreach (string line in inData) { 
     sw.WriteLine(line); 
    } 
    sw.Flush(); 
    if (sw.BaseStream != null) 
     sw.BaseStream.Flush(); 
    sw.Close(); 

avec

File.WriteAllLines(saveFile.Filename, inData); 
+0

J'ai essayé, mais malheureusement, cela n'a pas fonctionné. Même résultat qu'avant. (L'utilisation de la ligne que vous avez suggérée dans la méthode 'saveAsToFile' fonctionne, mais pas dans la méthode 'saveFile'.) –

+0

Avez-vous parcouru le code dans le débogueur? Savez-vous si savefile.Filename a vraiment la valeur que vous attendez? –

+0

Je ne sais pas vraiment comment fonctionne le bugger. J'utilise MessageBox.Show pour imprimer les valeurs des variables, lors de l'exécution de l'application. EDIT: Oui, le nom de fichier correspond à ce que je souhaite. –