2011-01-25 116 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。