0

重複の可能性:
ファイルが別のプロセスで使用されているため、ストリームリーダーを開く際にエラーが発生しました

C# で、テキスト ファイルにリストされている一定量のファイルまたはディレクトリを、あるコンピューターから同じネットワーク上の別のコンピューターにコピーするプログラムを構築しようとしています (例: "\PC_OF_MARK" から "\PC_OF_SARAH" へ)。 StreamReader を開いたり閉じたりした後、ストリームライターでストリームを開くことに固執しているようです。

何かをコピーする前に、自分のプログラムで「files.txt」の内容を編集できる必要があります。

私のフォームには、追加、削除、閉じる、コピーの 4 つのボタンがあります。「files.txt」の行を含む ListBox lbItems もあります。

プログラムは Delete 関数にあります。「files.txt」から 1 行を削除するには、lbItems の内容を読み取り、List に保存します。次に、lbItems で選択した項目と同じインデックスを持つリスト内の文字列を削除します。最後に、StreamWriter を開き (ここでエラーが発生します)、「files.txt」を新しいリストで上書きして、「files.txt」を更新します。

「files.txt」には次の 2 行が含まれます。

"%UserProfile%\Documents\files.txt" & "%UserProfile%\Downloads\RubiksCube"

public partial class Form1 : Form
{

    List<string> envKeys = new List<string>();
    List<string> envValues = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void btnClose_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        IDictionary ev = Environment.GetEnvironmentVariables();
        foreach (DictionaryEntry de in ev)
        {
            envKeys.Add("%" + de.Key.ToString() + "%");
            envValues.Add(de.Value.ToString());
        }
        syncList();
    }

    private void syncList()
    {
        StreamReader r = new StreamReader(@"C:\Users\Eigenaar\Documents\files.txt");
        string line = r.ReadLine();
        while (line != "")
        {
            lbItems.Items.Add(line);
            line = r.ReadLine();
        }
        r.Close();
    }

    private void btnRemove_Click(object sender, EventArgs e)
    {

        if (lbItems.SelectedIndex != -1)
        {
            if (MessageBox.Show("Ben je zeker dat je " + lbItems.Items[lbItems.SelectedIndex] + " uit de lijst wil verwijderen?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.None) == DialogResult.Yes)
            {
                List<string> array = new List<string>();
                using (StreamReader r = new StreamReader(@"C:\Users\Eigenaar\Documents\files.txt"))
                {
                    string line = r.ReadLine();
                    while (line != null)
                    {
                        array.Add(line);
                        line = r.ReadLine();
                    }
                    string t = r.ReadToEnd();
                }

                array.RemoveAt(lbItems.SelectedIndex);

                //Error occurs here:
                using (StreamWriter w = new StreamWriter(@"C:\Users\Eigenaar\Documents\files.txt", false))
                //The process cannot access the file 'C:\Users\Eigenaar\Documents\files.txt' because it is being used by another process.
                {
                    foreach (string str in array)
                    {
                        w.WriteLine(str);
                    }
                }
                lbItems.Items.RemoveAt(lbItems.SelectedIndex);
            }
        }
    } 
}

私が何を言っているのか知っている人がいたら、助けてください!

4

1 に答える 1

0

私はあなたの問題が最初にあると思います

using(StreamReader r = new StreamReader(@"C:\Users\Eigenaar\D...

ストリームが破棄されるusing結果になるはずですが、それではストリームを十分に速く閉じることができない可能性があるため、最初のブロックr.Close()の最後に追加してみます。usingこれにより、ハンドルが解放され、再び開くことができるようになります。

それでも問題が解決しない場合は、ファイルを読み取り共有として開いて、ロックされないようにすることができます。

于 2012-09-20T23:59:26.133 に答える