0

ファイルへの書き込みに StreamWriter を使用しています。「使用中」を使用しているため、自動的に閉じますが、保存しようとすると(ファイルに書き込みます)、「別のプロセスが使用しているため、ファイルにアクセスできません」というエラーが表示されます。このエラーが発生している場所や理由がわかりません。これは私のコードです

[WebMethod]
    public static bool saveToCSV(string[] valueArray)
    {
        bool saveOK = false;

        try
        {
            string filepath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            using (StreamWriter sw = new StreamWriter(filepath + "\\spreadsheet.csv", false))
            {

                foreach (var i in valueArray)
                {
                    if (i.ToString() == "\n")
                    {
                        sw.Write(sw.NewLine);
                    }
                    else
                    {
                        {
                            if (i.ToString() == "")
                            {
                                sw.Write(" ");
                                sw.Write(",");
                            }
                            else
                            {
                                sw.Write(i.ToString());
                                sw.Write(",");
                            }
                        }
                    }
                }
                sw.Flush();
            }//close using

            saveOK = true;
        }
        catch (Exception ex)
        {
            saveOK = false;
        }

        return saveOK;
    }
4

2 に答える 2

2

そのコードは問題ないようです。

他にどこでファイルを処理していますか? 他のすべてのファイル IO 操作はusingブロックに含まれていますか? ファイルにアクセスしている可能性のある他のアプリケーションは何ですか?

別の場所でファイルを開き、ストリームを破棄していない場合、または別のアプリケーションでファイルが開かれている場合、この例外が発生します。

于 2013-03-09T01:32:53.363 に答える
1

おそらくここで起こっているのは、saveToCSVメソッドが同時に 2 回呼び出されているということです。基本的に 2 つのクライアントが同時に Web サービスを呼び出します。これにより、最初の呼び出しでファイルが書き込み用に開かれているため、2 番目の呼び出しがアクセスを拒否されるという状況が発生する可能性があります。

これを防ぐには、ロックを使用してファイルへのアクセスを規制する必要があります

private static object _key = new object();

[WebMethod]
public static bool saveToCSV(string[] valueArray)
{
   ...
   lock (_key) { 
    using (StreamWriter sw = new StreamWriter(filePath + "\\spreadsheet.csv")) {
      ...
    }
   }
}

複数のクライアント呼び出しが同時に発生した場合、一度に 1 つずつファイルにアクセスしようとします。

于 2013-03-09T01:55:28.003 に答える