2016-04-05 16 views
1

こんにちは私は現在、以下のコードを使用して、ファイルを複数の2mbの小さな部分に分割しています。ファイルの分割を最適化する

const int BUFFER_SIZE = 20 * 1024; 
byte[] buffer = new byte[BUFFER_SIZE]; 

using (Stream input = File.OpenRead(inputFile)) { 
    int index = 0; 
    while (input.Position < input.Length) { 
     using (Stream output = File.Create(path)) { 
      int remaining = chunkSize, bytesRead; 
      while (remaining > 0 && (bytesRead = input.Read(buffer, 0, 
         Math.Min(remaining, BUFFER_SIZE))) > 0) { 
       output.Write(buffer, 0, bytesRead); 
       remaining -= bytesRead; 
      } 
     } 
    } 
    index++; 
} 

これは完璧に動作し、5×2メガバイトのファイル0.part、2.part電気ショック療法に10メガバイトのファイルを分割します...

私は再び一部だけ3を生成する方法を知っていただきたいと思いますchunkSizeが常に2MBのままであることを知っている。私はif、else、およびindexを評価することでこれを実現できますが、1GBのファイルではこの処理には時間がかかります。私はこの機能をもっと理解したいのですが、私が必要とするファイルの一部をどうやって得ることができるのでしょうか?

+0

あなたは[Stream.Seek]を使用することができます正しい場所を探すために(つまり、 '3 * 2mbの位置に移動してください(https://msdn.microsoft.com/en-us/library/system.io.filestream.seek(v=vs.110).aspx) '):' input.Seek(3 * 2 * 1024 * 1024、SeekOrigin.Begin); '。戻り値を確認して、正しい場所を探していることを確認してください。 –

答えて

3

input.Positionプロパティが設定可能です。あなたはパート3が必要なことがわかっている場合は、最初の2つのチャンクをスキップし、出力にその位置からコピーするために一度、最内whileループを行うために2*chunkSizePositionを設定します。

int desiredChunkNumber = 3; 
using (Stream input = File.OpenRead(inputFile)) { 
    input.Position = (desiredChunkNumber - 1) * chunkSize; 
    using (Stream output = File.Create(path)) { 
     int remaining = chunkSize, bytesRead; 
     while (remaining > 0 && (bytesRead = input.Read(buffer, 0, 
        Math.Min(remaining, BUFFER_SIZE))) > 0) { 
      output.Write(buffer, 0, bytesRead); 
      remaining -= bytesRead; 
     } 
    } 
} 
+0

これは完璧に働いてくれてありがとう、私は入力を認識していませんでした。位置は設定可能でした! :) – NathanJ

関連する問題