Как сгенерировать имя несуществующего файла и заблокировать его создание?

0

Я хочу протестировать поведение "Нет такого файла" в моей программе. Для этого (наверняка) мне нужно некоторое имя файла, которое укажет на несуществующий файл.

Что такое метод для создания такого имени файла и гарантии его отсутствия в процессе тестирования? - У меня нет никаких идей, поэтому я практически ничего не пытался.

Я хочу реализовать его в C++, но, действительно, это не вопрос C++.


Обновление # 1

Это приемлемо для поиска решения, по крайней мере, для Linux.

  • 0
    Классическая проблема XY. Что вы действительно пытаетесь достичь?
  • 0
    @EJP Я пытаюсь проверить, что моя программа выдаст определенную ошибку в случае, если требуемый файл не существует.
Показать ещё 6 комментариев
Теги:

3 ответа

2

Вероятно, нет возможности получить 100% -ную гарантию, но вы можете легко защитить от чего-либо, созданного другим пользователем, сначала создав каталог, в котором только у вас есть права доступа, а затем создайте там файл. После этого вы должны убедиться, что не делаете ничего, чего не хотите. (Как правило, в любое время вам понадобятся временные файлы, создание каталога, принадлежащего вам, и к которому только вы имеете доступ, - это хороший предупредительный ход.)

  • 0
    Это хорошее предложение, но всегда есть «root», который может изменить разрешения, удалить мою драгоценную папку или просто создать файл там ... Но я думаю, что это лучше, чем полагаться на вероятность генераторов имен файлов.
  • 0
    @ abyss.7 Роль root требует, чтобы он мог противоречить вашим предположениям. Он также может прервать ваш процесс без причины или даже (по крайней мере, в Unix) привести к нарушению сегмента. В принципе, вы ничего не можете сделать, чтобы не дать руту связываться с вами. (Механизм защиты Windows несколько сложнее, чем в Unix, но, в конце концов, должен быть администратор, который также может сделать что угодно, поскольку это необходимо для того, чтобы исправить ошибки, которые могли запутать другие пользователи. )
Показать ещё 1 комментарий
0

На самом деле невозможно создать имя файла, которое не будет существовать (условия гонки). Вы можете получить имя с помощью функции stdio 'char * tmpnam (char * s);' которые генерируют имя, которое трудно угадать.

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

class NoFStream : public std::fstream
{
    public:
    NoFStream(const char*, ios_base::openmode = ios_base::in | ios_base::out) {
        setstate(ios_base::failbit);
    }

    void open(const char*, ios_base::openmode = ios_base::in | ios_base::out) {
        setstate(ios_base::failbit);
    }
};

int main()
{
    NoFStream f("/tmp/file");
    if(f >> std::ws) std::cout << "This will not succeed" << std::endl;
    else std::cout << "Ok - it fails" << std::endl;
    return 0;
}
0

В Windows используйте _tempnam, на POSIX (например, Linux или OSX) используйте tempnam.

  • 0
    Цитата из вашей ссылки: «Между временем создания пути и открытием файла возможно, что какой-то другой процесс создаст файл с тем же именем».
  • 0
    @ abyss.7 Да, и поэтому он будет помечен как устаревший в пользу функций, которые вместо этого создают реальные файлы. Однако, если вы используете специальный каталог, который, как вы знаете, программы (или очень немногие) будут добавлять плитки (то есть не системный временный каталог), то вряд ли у вас возникнет такая проблема.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню