0

ファイルが書き込まれた直後に UNC パスからファイルを読み取れないというまれなケースがあります。ワークフローは次のとおりです。

  1. plupload は大きなファイルをまとめて WebAPI メソッドに送信します
  2. メソッドは、チャンクを UNC パス (ストレージ サーバー) に書き込みます。これは、ファイルが完全にアップロードされるまでループします。
  3. 他のいくつかの操作の後、同じメソッドがファイルを再度読み取ろうとしますが、ファイルが見つからない場合があります

サーバーがしばらくアイドル状態になった後にのみ発生するようです。アップロードを数回繰り返すと、機能し始めます。

ネットワーク構成の問題か、ファイルが再度読み取られる前に完全に閉じられていないことに関係していると思いました。

ファイルを書き込むコードの一部を次に示します (この場合、ファイルストリームは問題ありませんか?)

SaveStream(stream, new FileStream(fileName, FileMode.Append, FileAccess.Write));

SaveStream の定義は次のとおりです。

 private static void SaveStream(Stream stream, FileStream fileStream)
    {
        using (var fs = fileStream)
        {
            var buffer = new byte[1024];

            var l = stream.Read(buffer, 0, 1024);
            while (l > 0)
            {
                fs.Write(buffer, 0, l);
                l = stream.Read(buffer, 0, 1024);
            }
            fs.Flush();
            fs.Close();
        }
    }

ファイルを読み取るコードは次のとおりです。

var fileInfo = new FileInfo(fileName);
var exists = fileInfo.Exists;

fileInfo.Existsfalse を返すのは です。

ありがとうございました

4

1 に答える 1

1

この種のエラーは、ほとんどの場合、ファイルがまだ閉じられていないことが原因です。fileName を SaveStream に渡してから、次のように使用してみてください。

private static void SaveStream(Stream stream, string fileName)
{
    using (var fs = new FileStream(fileName, FileMode.Append, FileAccess.Write))
    {
        var buffer = new byte[1024];

        var l = stream.Read(buffer, 0, 1024);
        while (l > 0)
        {
            fs.Write(buffer, 0, l);
            l = stream.Read(buffer, 0, 1024);
        }
        fs.Flush();
    } // end of using will close and dispose fs properly
}
于 2013-09-25T20:17:41.050 に答える