web-dev-qa-db-fra.com

Comment écraser un fichier s'il existe déjà?

Je fais un lecteur de musique. Il a 2 formes; l'un est la zone principale où vous jouez de la musique. Le second formulaire contient une CheckedListBox dans laquelle vous sélectionnez les mp3 que vous voulez . Lorsque je clique sur un bouton, il enregistre la sélection dans un fichier .txt afin que je puisse y accéder dans le premier formulaire, où je placerai les chaînes les chemins pour que le lecteur de musique trouve les fichiers.

C'est le code de ma deuxième forme, où je sauvegarde les chansons sélectionnées dans des fichiers .txt.

private void selectbtn_Click(object sender, EventArgs e)
{
    if (File.Exists(@"C:\Users\Me\Desktop\JAM_MACHINE\JAMS\record.txt"))
    {
       File.WriteAllText(@"C:\Users\Me\Desktop\JAM_MACHINE\JAMS\record.txt", String.Empty);
    }

    string[] checkedtitles = new string[checkedListBox1.CheckedItems.Count]; 

    for (int ii = 0; ii < checkedListBox1.CheckedItems.Count; ii++)
    {
        checkedtitles[ii] = checkedListBox1.CheckedItems[ii].ToString();
    }
    string selectedSongs = String.Join(Environment.NewLine, checkedtitles); 

    songRecord.writeRecord(selectedSongs); //I initialised the class containing streamwriter/reader, and called it songRecord
    this.Close();   
}

Le problème est que, chaque fois que je ferme le programme et que je l'ouvre à nouveau, je ne peux pas réécrire/effacer le fichier .txt. Il ajoute simplement au fichier existant. Y a-t-il quelque chose que je ne fais pas bien?

Voici mes codes streamreader/writer. Je suis sûr que je l'ai fermé après avoir couru aussi, mais peut-être que quelqu'un peut comprendre ce qui ne va pas:

namespace songss
{
    class DataRecord
    {
    public void writeRecord(string line)
    {
        StreamWriter sw = null;
        try
        {
            sw = new StreamWriter(@"C:\Users\Me\Desktop\JAM_MACHINE\record.txt", true);
            sw.WriteLine(line);
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("Error: File not found.");
        }
        catch (IOException)
        {
            Console.WriteLine("Error: IO");
        }
        catch(Exception)
        {
            throw;
        }
        finally
        {
            if (sw != null)
                sw.Close();
        }
        }

 public void readRecord()
    {
        StreamReader sr = null;
        string myInputline;
        try
        {
            sr = new StreamReader(@"C:\Users\Me\Desktop\JAM_MACHINE\record.txt");
            while ((myInputline = sr.ReadLine()) != null) ; //readline reads whole line
            Console.WriteLine(myInputline);
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("Error: File not found");
        }
        catch(IOException)
        {
            Console.WriteLine("Error: IO");
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            if (sr != null)
                sr.Close();
        }
    }
    }
    }
7
Manny

WriteAllText

File.WriteAllText devrait faire ce que vous voulez.

Crée un nouveau fichier, écrit la chaîne spécifiée dans le fichier, puis ferme le fichier. Si le fichier cible existe déjà, il est écrasé.

StreamWriter

La classe StreamWriter a aussi une option pour écraser/ajouter:

Initialise une nouvelle instance de la classe StreamWriter pour le .__ spécifié. fichier en utilisant l'encodage et la taille de tampon par défaut. Si le fichier existe, il peut être écrasé ou ajouté.

public StreamWriter(
    string path,
    bool append
)

Exemple:

using (StreamWriter writer = new StreamWriter("test.txt", false)){ 
    writer.Write(textToAdd);
}

En regardant votre code, vous passez true qui signifie ajouter.

sw = new StreamWriter(@"C:\Users\Me\Desktop\JAM_MACHINE\record.txt", true);
sw.WriteLine(line);

.NET Compact Framework

Si vous êtes bloqué sur une version .NET qui ne prend en charge rien (par exemple, un cadre compact), vous pouvez également implémenter vous-même WriteAllText:

static void WriteAllText(string path, string txt) {
    var bytes = Encoding.UTF8.GetBytes(txt);
    using (var f = File.Open(path, FileMode.Create)) {
        f.Write(bytes, 0, bytes.Length);
    }
}
16
Nicholas

Consultez ce lien pour la solution fournie par Microsoft: ( Https://msdn.Microsoft.com/en-us/library/system.io.file.appendtext(v=vs.110).aspx )

Voici le code pour ajouter un fichier existant:

StreamWriter writer = File.AppendText(Filepath);
writer.WriteLine(content);
writer.Close();
0
AutomationNerd

Utilisez ceci

File.WriteAllText(@"C:\Users\Me\Desktop\JAM_MACHINE\JAMS\record.txt", line);

au lieu de 

sw = new StreamWriter(@"C:\Users\Me\Desktop\JAM_MACHINE\record.txt", true);
            sw.WriteLine(line);
0