这是一个在采访中被问到的问题,但仍无法找到方法 -
假设我有.txt文件,我想从该文件的内容中删除最后4个字符而不打开文件。第一个问题是 - 它真的可行吗?如果是,那么该怎么做呢?
答案 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的更多信息,请查看以下链接:
如果要跳过FileStream方式,第三种方法是使用StreamReader和StreamWriter,然后使用StreamReader读取一个没有最后4个字节的文件,然后使用StreamWriter编写它。但我仍然建议使用上面的FileStream示例。
答案 1 :(得分:2)
编辑:我认为“打开文件”意味着“获取文件的句柄”。
当然可以:
答案 2 :(得分:0)
如果您关心的是阅读长文件的所有数据:这是没有必要的。如果我们假设你真的意味着字节,那么简单地说:
using (var file = File.Open(path, FileMode.Open, FileAccess.Write)) {
file.SetLength(file.Length - 4);
}
这是不读取文件的内容。
如果您指的是字符,那么您需要仔细考虑编码 - 4个字符不一定是4个字节。