1

を使用してStreamReaderいますが、2 つの -objects を使用して同じストリームから読み取ろうとすると、StreamReaderI というエラーが表示されますcan't read from dispose object (reader3.ReadLine)。私はオブジェクトを処分していないので、何が間違っていますか?

Stream responseStream2;
FtpWebResponse ftpResponse2;

string casefile = CNCElement.ID_CASE_TEST_FILE;
string casepath;
if (FileManager.PathCombine(result, lock_root_folder, casefile, out casepath) == false)
    return false;
if (fm.DownloadFtp(result, casepath, out responseStream2, out ftpResponse2) == false)
    return false;

StreamReader reader2 = new StreamReader(responseStream2);
StreamReader reader3 = new StreamReader(responseStream2);
byte[] contents=null;
//if cycle is not present update case file
//if cycle is present, case file is already correct
if (reader2.ReadToEnd().Contains(cycle) == false)
{
    byte seekcase = CNCElement.ID_CASE.Value;
    int casecount = 1;
    string line;
    using (MemoryStream ms = new MemoryStream())
    {
        while ((line = reader3.ReadLine()) != null
              || casecount <= seekcase)
        {
            if (line.Contains("\"\"") == true)
            {
                if (casecount == seekcase)
                    line = line.Replace("\"\"", "\"" + cycle + "\"");
            }
            byte[] app = StrToByteArray(line);
            ms.Write(app, 0, line.Length);
            contents = ms.ToArray();
        }
    }
}

if (reader2 != null)
    reader2.Close();
if (ftpResponse2 != null)
    ftpResponse2.Close();
4

2 に答える 2

3

あなたが最後まで読んだとき、reader2あなたは本当に基礎となるストリームの最後まで読んでいます(responseStream2)。この時点で、そのストリームからの別の読み取りは失敗します。

特定の例外がわずかに予想されますが、同じストリームを別のストリームでラップするとStreamReaders、奇妙なことが行われるため、奇妙なことが行われます。

ストリームを2回読み取る必要がある場合は、その位置を最初にリセットすることをサポートするストリーム(つまり、ランダムアクセス)を使用してから、2回目の読み取り用に新しいリーダーを作成する必要があります。または(この場合に起こりそうなことですが、どのネットワークストリームもランダムアクセスをサポートするとは思えません)、ストリームコンテンツを自分でバッファリングします。

于 2013-02-25T11:49:22.477 に答える
3

基になるスチームを呼び出すとReadToEnd()、すべてがメモリに読み込まれ、最後に到達しました。

関数を呼び出すたびにReadLine()、基になるストリームが次の行に移動します。

これは、アプリケーションがReader3.ReadLine()ループに達すると、すでにファイルの終わりに達しているため、リーダーが失敗することを意味します。

予想されるファイル ストリームが大きすぎない場合は、ReadToEnd()呼び出しの結果を変数に代入し、この変数に対して後続の操作を実行することをお勧めします。

ストリームが大きい場合は、Positionプロパティをリセットしてみてください (サポートされている場合 - docs を参照してください)。

于 2013-02-25T11:47:02.127 に答える