删除文件的最后4个字节而不打开文件?

时间:2014-09-29 11:40:53

标签: c# file-handling

这是一个在采访中被问到的问题,但仍无法找到方法 -

假设我有.txt文件,我想从该文件的内容中删除最后4个字符而不打开文件。第一个问题是 - 它真的可行吗?如果是,那么该怎么做呢?

3 个答案:

答案 0 :(得分:3)

我猜您无法读取该文件的内容。所以如果你可以打开"它只具有只写访问权限:

using (var fileStream = File.Open("initDoc.txt", FileMode.Open, FileAccess.Write))
{
    fileStream.SetLength(fileStream.Length - 4);
}  

当然,您需要进行额外的检查,以确保根据编码减去正确的字节数,而不是减去超过长度等。

如果您不能使用FileMode.Open,则可以使用使用SafeFileHandle的FileStream构造函数的重载。要获取文件的SafeFileHandle,您需要使用C#Interop。在下面的这个例子中,我已经包装了互操作代码,以便在名为" UnmanagedFileLoader"的类中获取文件句柄:

var unmanagedFileLoader = new UnmanagedFileLoader("initDoc.txt");

using (var fileStream = new FileStream(unmanagedFileLoader.Handle, FileAccess.Write))
{
    fileStream.SetLength(fileStream.Length - 4);
}

UnmanagedFileLoader在内部使用非托管的CreateFile函数打开具有写权限的现有文件:

handleValue = CreateFile(Path, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

有关如何获取SafeFileHandle的更多信息,请查看以下链接:

http://msdn.microsoft.com/en-us/library/microsoft.win32.safehandles.safefilehandle%28v=vs.110%29.aspx

如果要跳过FileStream方式,第三种方法是使用StreamReader和StreamWriter,然后使用StreamReader读取一个没有最后4个字节的文件,然后使用StreamWriter编写它。但我仍然建议使用上面的FileStream示例。

答案 1 :(得分:2)

编辑:我认为“打开文件”意味着“获取文件的句柄”。

当然可以:

  • 打开包含文件
  • 的驱动器的句柄
  • 获取文件系统类型
  • 扫描包含所有文件信息的结构内容:MFT(适用于NTFS),FAT记录等。
  • 找到与您的文件对应的条目
  • 通过将4减去存储“文件大小”信息的值来更新条目(写入):)

答案 2 :(得分:0)

如果您关心的是阅读长文件的所有数据:这是没有必要的。如果我们假设你真的意味着字节,那么简单地说:

using (var file = File.Open(path, FileMode.Open, FileAccess.Write)) {
    file.SetLength(file.Length - 4);
}

这是读取文件的内容

如果您指的是字符,那么您需要仔细考虑编码 - 4个字符不一定是4个字节。