我有以下情况。我有一个大文件,说1 KB。我想读取前100个字节,然后从文件中删除100个字节的读取数据,然后读取下100个字节。要读取100个字节是可以的,但是如何从文件中删除100个字节?如何在Visual C++中截断文件?
回答
这通常做一个多步骤的过程:
- 重命名原始文件。
- 将你想要的数据写入一个带有原始文件名的新文件。
- 使用包含不再需要的数据的临时名称删除旧文件。
这样,如果出现问题,您可以简单地恢复您重命名的原始文件。将文件从一个地方移动到另一个地方也是这样实施的。
但是,如果您不想这样做,则SetEndOfFile
function是另一个可行的选项,可以在原地截断文件的内容。从文档:
为指定的文件到文件指针的当前位置的物理文件的大小。
物理文件大小也被称为文件的结尾。
SetEndOfFile
函数可用于截断或扩展文件。
我的理解是OP想要删除文件开头的数据。 “SetEndOfFile”函数可能会删除尚未读取的数据。 – 2011-05-17 16:52:40
@Thomas:这是可能的。我认为自从我上次查找它之后,“truncate”这个词的定义仍然是一样的。无论哪种情况,我的答案的第一部分都适用。第二种方法对于那些可能想要重新设计其逻辑以在文件末尾执行更正常的截断数据的人很有用。 – 2011-05-17 23:22:02
只有当没有其他线程正在写入文件或使用它时,您才可以完成这3个步骤。 – 2011-07-14 09:06:00
那不会被称为截断;该术语是指从最终而不是开始移除数据。我不知道任何可能的操作系统,除了从第100个字节开始将文件内容复制到新文件之外。
另请参阅http://blogs.msdn.com/b/oldnewthing/archive/2010/12/01/10097859.aspx,其中详细解释了为什么没有实施。 – MSalters 2011-05-17 15:18:10
删除已在文件中处理的数据非常耗时,并且在大多数情况下不是必需的。
删除文件顶部或中间附近的数据需要编写一个新文件,这需要时间和磁盘空间。大多数应用程序将读取并处理整个文件,然后重命名文件(使用备份扩展名)。这对调试有用。删除整个文件通常是一个更快的操作,即在不处理数据的情况下编写新文件。
删除只能在必要时进行。对于文件,可以存储有效数据开始位置的偏移量,从而减少了从文件中删除数据的需求。出于安全目的,覆盖文件中的数据通常会更快,然后创建一个没有处理数据的新文件。
首先尝试编写程序以不删除文件中的数据。只有在程序健全并正常工作后,才能根据需要删除。许多人建议只在没有更多空间的情况下删除文件。
- 1. C#截断CSV文件#
- 2. c#日志文件截断
- 3. 如何截断在CSV文件蟒蛇
- 4. 如何在C#中截断列表?
- 5. 如何检测C#中的截断文件
- 6. Erlang文件截断
- 7. Javascript文件被截断
- 8. C++ XOR加密截断文件
- 9. 如何使open()截断现有文件
- 10. 如何通过sudo截断glob文件?
- 11. 如何截断文本中的文本
- 12. 在PHP中截断文本?
- 13. 在TTStyledTextLabel中截断文本
- 14. 如何在Visual C++中创建文件
- 15. 如何在Visual C++中复制文件?
- 16. XmlDocument.WriteTo截断结果文件
- 17. Joomla Mootools文件被截断
- 18. 如何截断HTML中的文本
- 19. 如何截断html中的文本
- 20. 如何截断Angular2中的文本?
- 21. 如何在Perl中截断,创建,写入和移动文件?
- 22. Subwcrev.exe截断版本文件
- 23. 截断DBX核心文件?
- 24. 截断ASP.NET MVC C#
- 25. 停止截断Java文件?
- 26. ResXResourceWriter截断文件结尾
- 27. C# - 在位置后截断
- 28. master.info文件不断被截断
- 29. 截断RTF文件中的关键字
- 30. 如何截断在.NET
1kb不是一个大文件。它实际上是一个非常小的文件。除非您处于内存非常有限的嵌入式场景中,否则您为何不读取整个文件? – 2011-05-17 11:35:03