пример fopen
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
FILE * pFile;
for(int i=0; i < 1000000; i++)
{
bool ret = remove("C:\\abc.txt");
pFile = fopen ("C:\\abc.txt","w");
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
fclose (pFile);
}
else
{
printf("%d fopen() fails \n", count);
}
}
return 0;
}
Здесь, после вызова remove, pFile = fopen ("C:\abc.txt", "w"), вызывается,
Иногда даже в C:\файл abc.txt отсутствует после вызова remove, но указатель fopen pFile имеет значение NULL.
Это воспроизводится несколько раз не всегда. В этом примере эта проблема воспроизводится 50/60 раз.
Пожалуйста, предложите некоторое решение.
Если вы уже установили, что это проблема состояния гонки в базовой файловой системе, правильный способ ее исправить (как было предложено BLUEPIXY), просто remove
вызов remove
:
pFile = fopen ("C:\\abc.txt","w");
создаст файл, если он не существует и усекает его до размера 0, если он существует, что именно вам нужно.
remove
не является самой ненадежной функцией. Но в Windows происходит сбой при вызове открытого файла (кроме специального режима доступа), поэтому у вас возникает та же проблема гонки. ИМХО, вам следует пересмотреть свой алгоритм, чтобы не делать вызов удаления. В ваших условиях использования это небезопасно.
Если вам необходимо создать файл после удаления файла, вы можете задержать fopen, пока не убедитесь, что старый файл "abc.txt" удален.
Для этого вам нужно ввести некоторый цикл, чтобы подтвердить его, как показано ниже,
bool ret = remove("C:\\abc.txt");
FILE * rFile;
while(true)
{
rFile = fopen ("C:\\abc.txt","r");
if(rfile == null)
break; //File Removed confirmed!!
else
sleep(100); //Loop around again...
}
pFile = fopen ("C:\\abc.txt","w");
if (pFile!=NULL)
remove
return до того, как все действительно будет очищено, и немедленно создать файл с такими же разрывами имен. Попробуйте добавить короткий сон между удалением и созданием: это должно работать.