web-dev-qa-db-ja.com

既に存在するファイルを上書きする方法は?

音楽プレーヤーを作っています。 2つの形式があります。 1つは、音楽を演奏するメインエリアです。 2番目のフォームには、必要なmp3を選択するCheckedListBoxがあります。ボタンをクリックすると、選択内容が.txtファイルに保存されるので、最初のフォームでそれらにアクセスできます。音楽プレーヤーがファイルを見つけるためのパスに文字列を入力します。

これは、選択した曲を.txtファイルに保存する2番目のフォームのコードです。

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();   
}

問題は、プログラムを閉じて再度開くと、.txtファイルを書き換え/消去できないことです。既存のファイルに追加するだけです。私が正しくしていないことはありますか?

これが私のストリームリーダー/ライターのコードです。私も実行した後にそれを閉じたと確信していますが、おそらく誰かが間違っていることを理解することができます:

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();
        }
    }
    }
    }
11
Manny

WriteAllText

File.WriteAllText は、必要な処理を行う必要があります。

新しいファイルを作成し、指定された文字列をファイルに書き込み、ファイルを閉じます。ターゲットファイルが既に存在する場合、上書きされます。

StreamWriter

StreamWriterクラス には、上書き/追加するオプションもあります。

デフォルトのエンコーディングとバッファサイズを使用して、指定されたファイルのStreamWriterクラスの新しいインスタンスを初期化します。ファイルが存在する場合、上書きまたは追加できます。

public StreamWriter(
    string path,
    bool append
)

例:

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

コードを見ると、追加を意味するtrueを渡しています。

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

.NET Compact Framework

何もサポートしていない.NETバージョン(例:コンパクトフレームワーク)にこだわっている場合は、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);
    }
}
21
Nicholas

これを使って

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

の代わりに

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

Microsoftが提供するソリューションについては、次のリンクを参照してください:( https://msdn.Microsoft.com/en-us/library/system.io.file.appendtext(v = vs.110).aspx

既存のファイルを追加するコードは次のとおりです。

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