2011-01-25 333 views
0

我試圖讀取一個文件並提取2個數據塊,我們稱它們爲block1和block2,從文件中包含多個數據塊的文件中調用它們。兩個塊都需要在字節數組中返回 。 Block1將開始於文件開始的地方,該行開始 「block1:」,接着是要讀取的字節數。塊2(不一定出現在塊1的 之後)將開始於文件開頭的行「block2:」後面跟着要讀取的 個字節的位置。我被限制在最高的.Net 3.5。從文件中提取字節數組

回答

0

您可以使用File.ReadAllBytes和使用Array.Copy重載之一,如果你知道他們是在指數從返回byte[]提取您的塊。

+0

不幸的是,我不知道它們的索引。 – 2011-01-26 17:43:45

+0

@Ray低音 - 你知道關於塊的什麼_do_?你沒有真正提供你的問題中的任何信息。請編輯它並添加相關信息,以便人們可以給出有用的答案。 – Oded 2011-01-26 17:55:57

0

沒有任何類型的文件頭信息,你必須掃描整個文件,搜索您的block1:block2:標記。

更新:

這裏是你如何做到這一點的樣本(不一定是最好的實現):

byte[] GetBlockOfData(string fileName, string blockName) 
{ 
    var allBytes = File.ReadAllBytes(fileName); 
    // Assuming block names are ASCII-encoded 
    var blockMarker = Encoding.ASCII.GetBytes(blockName + ":"); 

    // Scan for the first byte of the marker 
    for (var i = 0; i < allBytes.Length; i++) 
    { 
     if (allBytes[i] == blockMarker[i]) 
     { 
      // See if this is the entire marker 
      var isMatch == true; 
      for (var j = 0; j < blockMarker.Length; j++) 
      { 
       if (allBytes[i + j] != blockMarker[j]) 
       { 
        isMatch = false; 
        break; 
       } 
      } 
      if (isMatch) 
      { 
       // Assuming it's a byte... 
       var blockLength = allBytes[i + blockMarker.Length]; 
       var result = new byte[blockLength]; 
       Array.Copy(
        allBytes, i + blockMarker.Length + 1, result, 0, 
        blockLength); 
       return result; 
      } 
     } 
    } 
    return null; 
} 
+0

感謝您的回覆。我同意。你有沒有示例代碼顯示如何做到這一點? – 2011-01-26 18:18:55

0

正如其他人所說,沒有頭信息,您需要,至少可以通過某種類型的過濾器來查找文件內容,以查找您的「塊」標記。

如果你有頭信息(或至少一些信息的地方,以補償您的塊標記的),你可以使用內存映射文件:

http://www.developer.com/net/article.php/3828586/Using-Memory-Mapped-Files-in-NET-40.htm

這需要.NET 4.0,雖然如果您不使用.NET 4,也可以使用Win32 API。