如何在C#中删除文件中的行

时间:2014-05-21 00:15:29

标签: c#

我已经提出了以下代码来删除文件的某些部分。方法的参数是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);
        }
    }

1 个答案:

答案 0 :(得分:1)

您使用的Read方法错误(但您并不孤单,这很常见)。

Read方法并不保证它会读取您请求的字节数。它可能只读取其中的一部分,它将返回它实际放入缓冲区的字节数。您需要使用该返回值,并继续读取,直到您拥有所需的所有字节:

int len = 0;
while (len < b1Len) {
  len += fileStream.Read(b1, len, b1Len - len);
}