Проверьте, существует ли файл, не открывая его

Как я могу проверить, существует ли файл в моем каталоге, прежде чем продолжить с моей программой? Я прочитал ответы, которые пытаются открыть файл различными способами, но моя проблема в том, что большую часть времени проверяемый файл будет поврежден и не может быть открыт. Это происходит в части проверки моей программы на наличие ошибок и будет запускаться только тогда, когда произошла ошибка в предыдущем коде. Я хочу проверить, существует ли файл, если да, то попросите удалить его, иначе просто распечатайте какое-нибудь сообщение.

Как я могу пойти по этому поводу?

(Простое удаление и принятие ошибок будет работать, но я делаю это, чтобы узнать, поэтому я хочу сделать это правильно …)

Редактировать:

Я скачал Boost для использования библиотеки файловой системы и скомпилировал ее, по-видимому, без ошибок, но когда я пытаюсь скомпилировать свою программу, я получаю такой ответ:

g++ program.cpp -I <path to>/boost_1_54_0 -o output

Undefined symbols for architecture x86_64:
"boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)", referenced from:
boost::filesystem::exists(boost::filesystem::path const&)in cc1XX8rD.o
"boost::system::system_category()", referenced from:
__static_initialization_and_destruction_0(int, int)in cc1XX8rD.o
"boost::system::generic_category()", referenced from:
__static_initialization_and_destruction_0(int, int)in cc1XX8rD.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Единственные места, где я использую поддержку в программе:

boost::filesystem::path my_file(s4);
if (boost::filesystem::exists(my_file)){ ...

5

Решение

использование stat() или же access():

#include <unistd.h>

int res = access(path, R_OK);
if (res < 0) {
if (errno == ENOENT) {
// file does not exist
} else if (errno == EACCES]) {
// file exists but is not readable
} else {
// FAIL
}
}
4

Другие решения

Файл, который существует, но содержит поврежденные данные, может быть открыт без вреда. До тех пор, пока вы не попытаетесь прочитать содержимое файла.

Тем не менее, любая «проверка, если она существует» подлежит TOCTUI и это совершенно не нужно в первую очередь. Лучше всего просто попытаться удалить файл и признать, что удаление не всегда работает.

3

Если, случайно, вы используете Boost в своем проекте, вы можете пойти с Boost.Filesystem:

#include <boost/filesystem.hpp>

boost::filesystem::path my_file("some/path/some_file");

if (boost::filesystem::exists(my_file))
{
boost::filesystem::remove(my_file);
}
else
{
std::cout << "File does not exist!" << std::endl;
}

Это решение переносимо во многих системах Реализация Boost.Filesystem.

2

Вы хотите сделать это без попыток открыть. Если вы передумаете и попытаетесь открыть файл:

bool file_exists(std::string filename){
ifstream ifile(filename);
return ifile;
}

Кто-то говорит, что это закроется автоматически. Я не знаю.

И, если вы не хотите открывать файл, я думаю, что есть много возможностей. Я могу рассказать о медленном, старомодном и безобразном решении, может быть, другие скажут вам лучшие решения. Вот:

system("dir > something.abc");

После этого вам нужно открыть что-то файл .abc и проанализировать / интерпретировать строки. Вы должны открыть файл что-то .abc, но вам не нужно открывать этот файл, который вы хотите проанализировать.

Это решение будет очень медленным (0,5 секунды, это не хорошо, например, для 100 файлов), вам придется написать много кода, и это будет очень сложно для анализа / интерпретации ответа команды «dir».

-2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector