我已经提出了以下代码来删除文件的某些部分。方法的参数是filePath和位置列表以及要从每个位置删除的长度。
请你检查我做得对吗?感谢
注意:要删除的部分不会重叠。所以我没有添加检查。
static void DeleteFileParts(string filePath, List<Tuple<int, int>> T)
{
using (var fileStream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite))
{
int tLen = 0;
int lastWriteL = 0;
int len = (int)fileStream.Length;
byte[] b1 = new byte[len];
for (int i = 0; i < T.Count; i++)
{
Tuple<int, int> t = T[i];
tLen += t.Item2;
fileStream.Seek(t.Item1 + t.Item2, 0);
int b1Len = i == T.Count - 1 ? (len - t.Item1 - t.Item2) : (T[i + 1].Item1 - t.Item1 - t.Item2);
fileStream.Read(b1, 0, b1Len);
fileStream.Seek(lastWriteL == 0 ? t.Item1 : lastWriteL, 0);
fileStream.Write(b1, 0, b1Len);
lastWriteL += t.Item1 + b1Len;
}
fileStream.SetLength(len - tLen);
}
}
答案 0 :(得分:1)
您使用的Read
方法错误(但您并不孤单,这很常见)。
Read
方法并不保证它会读取您请求的字节数。它可能只读取其中的一部分,它将返回它实际放入缓冲区的字节数。您需要使用该返回值,并继续读取,直到您拥有所需的所有字节:
int len = 0;
while (len < b1Len) {
len += fileStream.Read(b1, len, b1Len - len);
}