27

ファイルに内容を入力したいのですが、作成したい名前のファイルが存在するか確認したいです。もしそうなら、たとえファイルが空であっても、私はファイルを作成したくありません。

私の試み

bool CreateFile(char name[], char content[]){
     std::ofstream file(name);
     if(file){
         std::cout << "This account already exists" << std::endl;
        return false;
     }
     file << content;
     file.close();
     return true;
}

私がやりたいことをする方法はありますか?

4

9 に答える 9

30

操作がアトミックでなくても問題ないと仮定すると、次のことができます。

if (std::ifstream(name))
{
     std::cout << "File already exists" << std::endl;
     return false;
}
std::ofstream file(name);
if (!file)
{
     std::cout << "File could not be created" << std::endl;
     return false;
}
... 

複数のスレッドを実行して同じファイルを作成しようとしている場合、これは機能しないことに注意してください。また、 TOCTUIの問題があるため、2 番目のプロセスがファイルの作成を「妨害」することを確実に防ぐことはできません。[最初にファイルが存在するかどうかを確認してから作成しますが、確認と作成の間に他の誰かが作成した可能性があります。それが重要な場合は、別のことを行う必要があり、移植性がありません]。

さらに問題は、ファイルが読み取り不可 (読み取り用に開くことができない) であるが書き込み可能であるなどのアクセス許可を持っている場合、ファイルが上書きされることです。

ほとんどの場合、これらのことはどちらも重要ではありません。なぜなら、「ベスト エフォート」アプローチで「既にそのようなファイルを持っている」(またはそのようなファイルを持っている) ことを誰かに伝えることだけだからです。

于 2013-07-23T18:30:47.017 に答える
8

試す

ifstream my_file("test.txt");
if (my_file)
{
 // do stuff
}

From:ファイルが存在し、C++ で読み取り可能かどうかを確認する方法は?

または、ブースト機能を使用できます。

于 2013-07-23T18:30:18.740 に答える
7

C++17 の時点では、次のものがあります。

if (std::filesystem::exists(pathname)) {
   ...
于 2016-12-19T05:34:17.883 に答える
2

少し調べてみたところ、openシステムコールを使用していることしかわかりませんでした。ファイルが既に存在する場合に失敗する方法でファイルを作成できる唯一の機能です。

#include <fcntl.h>
#include <errno.h>

int fd=open(filename, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
if (fd < 0) {
  /* file exists or otherwise uncreatable
     you might want to check errno*/
}else {
  /* File is open to writing */
}

ファイルを作成しているので、許可を与える必要があることに注意してください。

これにより、存在する可能性のある競合状態も削除されます

于 2013-07-23T18:56:08.020 に答える
0

私はちょうどこのテストを見ました:

bool getFileExists(const TCHAR *file)
{ 
  return (GetFileAttributes(file) != 0xFFFFFFFF);
}
于 2016-08-17T12:07:28.330 に答える
-1

これを行う最も簡単な方法は、 を使用することios :: noreplaceです。

于 2016-12-16T15:20:27.000 に答える