2

行末のスペースを削除しようとすると、その行が別のファイルに書き込まれます。

しかし、プログラムがFileWriterそれに達すると、次のエラーが発生します

別のプロセスによって使用されているため、プロセスにアクセスできません。

コードは以下の通りです。

private void FrmCounter_Load(object sender, EventArgs e)
{
        string[] filePaths = Directory.GetFiles(@"D:\abc", "*.txt", SearchOption.AllDirectories);
        string activeDir = @"D:\dest";
        System.IO.StreamWriter fw;
        string result;

        foreach (string file in filePaths)
        {
            result = Path.GetFileName(file);
            System.IO.StreamReader f = new StreamReader(file);
            string newFileName = result;
            // Combine the new file name with the path
            string newPath = System.IO.Path.Combine(activeDir, newFileName);
            File.Create(newPath);

            fw = new StreamWriter(newPath);

            int counter = 0;
            int spaceAtEnd = 0;
            string line;

            // Read the file and display it line by line.
            while ((line = f.ReadLine()) != null)
            {
                if (line.EndsWith(" "))
                {
                    spaceAtEnd++;
                    line = line.Substring(0, line.Length - 1);
                }
                fw.WriteLine(line);
                fw.Flush(); 
                counter++;
            }

            MessageBox.Show("File Name : " + result);
            MessageBox.Show("Total Space at end : " + spaceAtEnd.ToString());
            f.Close();
            fw.Close();
        }
}
4

5 に答える 5

2

File.Createそれ自体がストリームを返します。

そのストリームを使用してファイルを書き込みます。このエラーが発生する理由は、によって返されたストリームFile.Createが開いていて、書き込みのためにそのファイルを再度開こうとしているためです。

によって返されたストリームを閉じるか、File.Createそのストリームをファイルの書き込みまたは使用に使用することをお勧めします

Stream newFile = File.Create(newPath);
fw = new StreamWriter(newFile);
于 2012-07-31T12:12:03.197 に答える
1

最初の問題を解決したとしても、元の場所にある新しいファイルにすべてを書き込みたい場合は、すべてのデータを配列に読み込んで元のを閉じることができますStreamReader。パフォーマンスに関する注意:ファイルが十分に大きい場合、このオプションはパフォーマンスに最適ではありません。

また、ファイルが存在しない場合はファイルを作成するか、デフォルトで上書きするか、パラメータをとして指定する場合は、ファイルを作成する必要File.Createはありません。StreamWriterappendfalse

result = Path.GetFileName(file);
String[] f = File.ReadAllLines(file);  // major change here... 
                                       //  now f is an array containing all lines 
                                       //  instead of a stream reader

using(var fw = new StreamWriter(result, false))
{
    int counter = f.Length; // you aren't using counter anywhere, so I don't know if 
                            //  it is needed, but now you can just access the `Length`  
                            //  property of the array and get the length without a 
                            //  counter

    int spaceAtEnd = 0;

    // Read the file and display it line by line.
    foreach (var item in f)
    {
        var line = item;

        if (line.EndsWith(" "))
        {
            spaceAtEnd++;
            line = line.Substring(0, line.Length - 1);
        }
        fw.WriteLine(line);
        fw.Flush(); 
    }
}

MessageBox.Show("File Name : " + result);
MessageBox.Show("Total Space at end : " + spaceAtEnd.ToString());

また、この方法を使用して、行末から複数のスペースを削除することはありません。それを行う必要がある場合は、次のように置き換えることを検討してline = line.Substring(0, line.Length - 1);くださいline = line.TrimEnd(' ');

于 2012-07-31T12:49:03.447 に答える
0

あなたの場合、あなたがそれらに書き込もうとする前に、あなたはあなたが読んでいるすべてのファイルを閉じる必要があります。

于 2012-07-31T12:11:17.347 に答える
0

編集:

Zafarは正しいですが、おそらくこれで問題が解決するでしょう。

File.Createはストリームを返すため、そのストリームは宛先ファイルを開きました。これにより、状況がより明確になります。

File.Create(newPath).Close();

上記の行を使用すると機能しますが、適切に書き直すことをお勧めします。これは説明のためだけのものです。

于 2012-07-31T12:11:38.593 に答える
0

次のようなステートメントを使用してストリームを書き込みます。

using (System.IO.StreamReader f = new StreamReader(file))
{
   //your code goes here
}
于 2012-07-31T12:11:46.330 に答える