2012-04-17 7 views
0

.NETを使用してイメージを作成しようとしています。以下は私が使用しているコードです。ほとんどの場合、これは大丈夫ですが、ストリームが途切れてしまってファイルが破損していると思われることがあります。私はURLを介してイメージを取得しています。.NETで壊れたファイルが作成される

私は自分のコードを修正したり、他に何ができるかについての洞察を提供する人を本当に探しています。

おかげ

// Function will return the number of bytes processed 
     // to the caller. Initialize to 0 here. 
     int bytesProcessed = 0; 

     // Assign values to these objects here so that they can 
     // be referenced in the finally block 
     Stream remoteStream = null; 
     Stream localStream = null; 
     WebResponse response = null; 

     // Use a try/catch/finally block as both the WebRequest and Stream 
     // classes throw exceptions upon error 
     try 
     { 
      // Create a request for the specified remote file name 
      WebRequest request = WebRequest.Create(remoteFilename); 
      if (request != null) 
      { 
       // Send the request to the server and retrieve the 
       // WebResponse object 
       response = request.GetResponse(); 
       if (response != null) 
       { 
        // Once the WebResponse object has been retrieved, 
        // get the stream object associated with the response's data 
        remoteStream = response.GetResponseStream(); 

        // Create the local file 
        localStream = File.Create(localFilename); 

        // Allocate a 1k buffer 
        byte[] buffer = new byte[1024]; 
        int bytesRead; 

        // Simple do/while loop to read from stream until 
        // no bytes are returned 
        do 
        { 
         // Read data (up to 1k) from the stream 
         bytesRead = remoteStream.Read(buffer, 0, buffer.Length); 

         // Write the data to the local file 
         localStream.Write(buffer, 0, bytesRead); 

         // Increment total bytes processed 
         bytesProcessed += bytesRead; 
        } while (bytesRead > 0); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     finally 
     { 
      // Close the response and streams objects here 
      // to make sure they're closed even if an exception 
      // is thrown at some point 
      if (response != null) response.Close(); 
      if (remoteStream != null) remoteStream.Close(); 
      if (localStream != null) localStream.Close(); 
     } 

は、私は次のエラーを取得しています:

Main Exception 
MESSAGE: Parameter is not valid. 
SOURCE: System.Drawing 
TARGETSITE: System.Drawing.Image FromStream(System.IO.Stream, Boolean, Boolean) 
STACKTRACE: at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData) 
      at Sitecore.Resources.Media.ImageMedia.GetImage() at Sitecore.Resources.Media.ImageMedia.UpdateMetaData(MediaStream mediaStream) 
      at Sitecore.Resources.Media.JpegMedia.UpdateMetaData(MediaStream mediaStream) at Sitecore.Resources.Media.MediaCreator.AttachStreamToMediaItem(Stream stream, String itemPath, String fileName, MediaCreatorOptions options) 
      at Sitecore.Resources.Media.MediaCreator.CreateFromStream(Stream stream, String filePath, MediaCreatorOptions options) 
      at Sitecore.Resources.Media.MediaCreator.CreateFromFile(String filePath, MediaCreatorOptions options) 
+1

例外はすべてキャッチされますか?そして、彼らは何を言いますか? – PaulG

+0

例外をキャッチしてスタックのトレースを失うのはなぜですか?そしてなぜあなたは 'using'ステートメントを使っていませんか? –

+1

中断されたTCP接続でエラーが発生することはありませんが、ストリームの終わりに達したように動作することがあります。 C#でダウンローダを作成したとき、一時ファイルにダウンロードし、期待されるサイズ(httpヘッダーから)がダウンロードされたサイズと一致することを確認したら、それをターゲットファイル名に移動しました。 – CodesInChaos

答えて

1

問題は、Windowsによってロックされているファイルとありました。基本的に、2つのサーバーがありました。ファイルを保存しておいたはずの別のサーバーにファイルを保存した。

関連する問題