我正在尝试读取一个文件并提取2个数据块,让我们从文件包含许多数据块的文件中调用它们block1和block2。两个块都需要 以字节数组返回。 Block1将从行开始的文件中的位置开始 “block1:”后跟要读取的字节数。 Block2,不一定出现在 block1,将从文件中的行开始“block2:”后面跟着 要读取的字节数。我最高限制在.Net 3.5。
答案 0 :(得分:0)
如果你知道它们所在的索引,你可以使用File.ReadAllBytes
并使用其中一个Array.Copy
重载从返回的byte[]
中提取块。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
正如其他人所提到的,如果没有标题信息,您至少需要通过某种类型的过滤器来流式传输文件内容,以查找“块”标记。
如果您确实有标题信息(或至少某些关于块标记偏移的信息),您可以使用内存映射文件:
http://www.developer.com/net/article.php/3828586/Using-Memory-Mapped-Files-in-NET-40.htm
这需要.NET 4.0,但如果您不使用.NET 4,也可以使用Win32 API。