ifstream 保持读取,即使文件不再存在

ifstream keeps read even though the file does not exists anymore

我在使用 std::ifstream 读取文件时遇到问题。我有一个名为“nice_folder.zip”的 zip 文件 (71.6MB) 以及重现该问题的以下代码:

#include <filesystem>
#include <fstream>
#include <iostream>
#include <memory>
#include <unistd.h>

int main() {

  size_t read = 0;
  size_t f_size = std::filesystem::file_size("nice_folder.zip");
  std::shared_ptr<char[]> buffer{new char[4096]};
  std::ifstream file{"nice_folder.zip"};
  while (read < f_size) {
    size_t to_read = (f_size - read) > 4096 ? 4096 : (f_size - read);
    file.read(buffer.get(), to_read);
    sleep(2);
    std::cout << "read: " << std::to_string(to_read) << "\n";
  }
}

问题如下:经过一些读取周期后,我从文件夹中删除了该文件,但它仍然继续读取它。这怎么可能 ?如果用户在使用 ifstream 阅读时删除文件,我该如何捕获错误?我猜想 ifstream 在开始读取之前将文件的内容存入内存,但我不确定。

如果您在例如linux,那么 OS 将不会真正删除该文件,直到您关闭它的所有文件句柄。所以看起来文件已被删除,但它仍存储在磁盘上的某个位置。参见例如What happens internally when deleting an opened file in linux.

因此,如果您正在尝试检测此文件删除以防止误读,请不要担心,该文件实际上不会被删除。

如果您关闭流,然后尝试为该文件再次打开它,您将收到错误消息。但这也意味着您将无法从中读取...