1

非常に単純なプログラムで問題が発生しています。まず、次のような実用的なコードから始めました。

RemoteFileInfo result = new RemoteFileInfo();

string filePath = System.IO.Path.Combine(ConfigurationManager.AppSettings["OmnitureSPDir"], request.FileName);
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);

// check if exists
if (!fileInfo.Exists)
    throw new System.IO.FileNotFoundException("File not found",
                      request.FileName);

// open stream
System.IO.FileStream stream = new System.IO.FileStream(filePath,
          System.IO.FileMode.Open, System.IO.FileAccess.Read);

// return result 
result.FileName = request.FileName;
result.Length = fileInfo.Length;
result.FileByteStream = stream;

return result;

これは、ファイル名を含む「request」と呼ばれるパラメーターを受け取り、ファイルが存在するかどうかを確認し、存在する場合はファイルをストリーミングします。

Visual StudioでMicrosoftコード分析を実行し、dispose()がないことに気付いた後、usingステートメントでラップすることで問題を「解決」しました。

using (RemoteFileInfo result = new RemoteFileInfo()) {

    string filePath = System.IO.Path.Combine(ConfigurationManager.AppSettings["OmnitureSPDir"], request.FileName);
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);

    // check if exists
    if (!fileInfo.Exists)
        throw new System.IO.FileNotFoundException("File not found",
                          request.FileName);

    // open stream
    System.IO.FileStream stream = new System.IO.FileStream(filePath,
              System.IO.FileMode.Open, System.IO.FileAccess.Read);

    // return result 
    result.FileName = request.FileName;
    result.Length = fileInfo.Length;
    result.FileByteStream = stream;

    return result;
}

このコードを実行した後、ファイルはストリーミングされなくなりましたが、次のエラーが発生することがわかりました。

Value cannot be null.
Parameter name: FileByteStream

Using()ステートメントを削除して問題を修正しましたが、理由がわかりません。コードを追加することで、私は良いことをしていると思いました。私が間違ったことを理解したいので、それを繰り返さず、このメソッドを適切にコーディングできます。

RemoteFileInfoの定義は次のとおりです

public class RemoteFileInfo : IDisposable
{
    [MessageHeader(MustUnderstand = true)]
    public string FileName;

    [MessageHeader(MustUnderstand = true)]
    public long Length;

    [MessageBodyMember(Order = 1)]
    public System.IO.Stream FileByteStream;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);

    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing && FileByteStream != null)
            {
                FileByteStream.Close();
                FileByteStream = null;
            }

    } 
}
4

2 に答える 2

0

ストリームでFlushメソッドを呼び出す必要があります。これにより、問題が修正されます。これは、ストリームをフラッシュする前に破棄するため、データがないためです;-)

于 2012-08-14T18:16:27.707 に答える
0

を実装するオブジェクトを返す場合IDisposable、それはできませんDispose。それは発信者次第でなければなりません。

于 2012-08-14T21:05:15.847 に答える