C++ 如果发现任何重复项,如何创建一个被修改的文件

C++ 如果发现任何重复项,如何创建一个被修改的文件,c++,file,winapi,directory,C++,File,Winapi,Directory,我希望使用用户给定的名称创建一个文件。如果文件名已经存在,我希望在创建之前自动修改文件名 if (GetFileAttributesA((name).c_str()) != INVALID_FILE_ATTRIBUTES) { int num = 0; //If True: Modify File Name while (GetFileAttributesA((name + "" + to_string(num) + "").c_str()) != INVALID_FIL

我希望使用用户给定的名称创建一个文件。如果文件名已经存在,我希望在创建之前自动修改文件名

if (GetFileAttributesA((name).c_str()) != INVALID_FILE_ATTRIBUTES)
{
    int num = 0;
    //If True: Modify File Name
    while (GetFileAttributesA((name + "" + to_string(num) + "").c_str()) != INVALID_FILE_ATTRIBUTES)
    {
        cout << (GetFileAttributesA((name + "" + to_string(num) + "").c_str()) != INVALID_FILE_ATTRIBUTES) << endl;
        num++;
    }
    CreateFileA((name + "" + to_string(num) + "" + ".txt").c_str(), NULL, NULL, NULL, 2, NULL, NULL);
    cout << "Created new file at: ";
    cout << (name + "" + to_string(num) + "" + ".txt").c_str() << endl;
}
else
{
    CreateFileA(name.c_str(), NULL, NULL, NULL, 2, NULL, NULL);
    cout << "Created new file at: ";
    cout << (name + ".txt").c_str() << endl;
}
if(GetFileAttributesA((name).c_str())!=无效的文件属性)
{
int num=0;
//如果为True:修改文件名
while(GetFileAttributesA((name+“”+to_string(num)+).c_str())!=无效的_文件属性)
{

cout使用
GetFileAttributes()
的方式会引入竞争条件。另一个进程可以在检查文件是否存在后,在打开/创建文件之前创建/删除该文件。
CreateFile()
具有使其失败的标志如果文件已存在,则应改用该功能。在您的示例中,将
dwCreationDisposition
参数设置为2(
CREATE\u ALWAYS
)将覆盖现有文件。改为将参数设置为1(
CREATE\u NEW
)。根据:

始终创建\u
二,

始终创建一个新文件

如果指定的文件存在且可写,则函数将覆盖该文件,函数将成功,最后一个错误代码将设置为error_ready_exists(183)

如果指定的文件不存在并且是有效路径,则会创建一个新文件,函数将成功,最后一个错误代码将设置为零

创建新的
一,

仅当新文件不存在时才创建新文件

如果指定的文件存在,则函数失败,最后一个错误代码设置为error_file_exists(80)

如果指定的文件不存在并且是可写位置的有效路径,则会创建一个新文件

例如:

string filename=name+“.txt”;
int num=0;
处理文件;
做
{
hFile=CreateFileA(filename.c_str(),0,0,NULL,CREATE_NEW,0,NULL);
if((hFile==无效的\u句柄\u值)&&(GetLastError()==错误\u文件\u存在))
filename=name+to_字符串(num++)+“.txt”;
其他的
打破
}
虽然(正确);
if(hFile!=无效的句柄值)
{

cout使用
GetFileAttributes()
的方式会引入竞争条件。另一个进程可以在检查文件是否存在后,在打开/创建文件之前创建/删除该文件。
CreateFile()
具有使其失败的标志如果文件已存在,则应改用该功能。在您的示例中,将
dwCreationDisposition
参数设置为2(
CREATE\u ALWAYS
)将覆盖现有文件。改为将参数设置为1(
CREATE\u NEW
)。根据:

始终创建\u
二,

始终创建一个新文件

如果指定的文件存在且可写,则函数将覆盖该文件,函数将成功,最后一个错误代码将设置为error_ready_exists(183)

如果指定的文件不存在并且是有效路径,则会创建一个新文件,函数将成功,最后一个错误代码将设置为零

创建新的
一,

仅当新文件不存在时才创建新文件

如果指定的文件存在,则函数失败,最后一个错误代码设置为error_file_exists(80)

如果指定的文件不存在并且是可写位置的有效路径,则会创建一个新文件

例如:

string filename=name+“.txt”;
int num=0;
处理文件;
做
{
hFile=CreateFileA(filename.c_str(),0,0,NULL,CREATE_NEW,0,NULL);
if((hFile==无效的\u句柄\u值)&&(GetLastError()==错误\u文件\u存在))
filename=name+to_字符串(num++)+“.txt”;
其他的
打破
}
虽然(正确);
if(hFile!=无效的句柄值)
{

cout使用
GetFileAttributes
检查的文件与正在创建的文件不同。请注意,在哪里输入
num
当一个代码毫无意义地变得复杂时,会出现典型的问题,计算出几倍于同一事物(事实上,由于错误,几乎是同一事物)…@JaedonKLB我们都明白,但你明白他的话吗?@JaedonKLB根本不使用引入竞争条件的
GetFileAttributes
CreateFile
如果文件存在,则有失败标志。在循环中调用
CreateFile
,在每次迭代中创建一个新文件名,直到创建完成为止successful@bruno 如果循环正确处理错误,则不会。GetLastError
将告诉他
CreateFile
失败的原因。在这种情况下,循环虽然
CreateFile
失败,但只存在
ERROR\u FILE\u
,其他任何错误都会导致循环中断。使用
GetFileAttributes
检查的文件不存在他与您正在创建的文件相同。请注意,您在哪里输入了
num
,当一个代码毫无意义地变得复杂时,会出现典型的问题,计算同一事物的几倍(事实上,由于错误,几乎是同一事物)…@JaedonKLB我们都明白,但你明白他的话吗?@JaedonKLB根本不使用引入竞争条件的
GetFileAttributes
CreateFile
如果文件存在,则有失败标志。在循环中调用
CreateFile
,在每次迭代中创建一个新文件名,直到创建完成为止successful@bruno 如果循环正确处理错误,则不会。GetLastError
将告诉他
CreateFile
失败的原因。在这种情况下,循环虽然
CreateFile
失败,但只存在
ERROR\u FILE\u
,其他任何错误都会导致循环中断