Як ми можемо перевірити, чи існує файл чи не за допомогою програми Win32? Я працюю в додатку Windows Mobile.
Відповіді:
Ви можете зателефонувати FindFirstFile
.
Ось зразок, який я щойно вибив:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
int fileExists(TCHAR * file)
{
WIN32_FIND_DATA FindFileData;
HANDLE handle = FindFirstFile(file, &FindFileData) ;
int found = handle != INVALID_HANDLE_VALUE;
if(found)
{
//FindClose(&handle); this will crash
FindClose(handle);
}
return found;
}
void _tmain(int argc, TCHAR *argv[])
{
if( argc != 2 )
{
_tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
return;
}
_tprintf (TEXT("Looking for file is %s\n"), argv[1]);
if (fileExists(argv[1]))
{
_tprintf (TEXT("File %s exists\n"), argv[1]);
}
else
{
_tprintf (TEXT("File %s doesn't exist\n"), argv[1]);
}
}
GetFileAttributes()
набагато краще.
GetFileAttributes
є одним лайнером
file = "*"
, це може повернутися, true
навіть якщо немає файлу з назвою *
Використовуйте, GetFileAttributes
щоб перевірити, чи існує об’єкт файлової системи та що це не каталог.
BOOL FileExists(LPCTSTR szPath)
{
DWORD dwAttrib = GetFileAttributes(szPath);
return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
!(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
Скопійовано з Як перевірити, чи існує каталог у Windows на C?
Ви можете скористатися цією функцією GetFileAttributes
. Він повертається, 0xFFFFFFFF
якщо файл не існує.
INVALID_FILE_ATTRIBUTES
якщо файл не існує. На 64-бітній це може бути 0xFFFFFFFFFFFFFFFF
.
DWORD
те, як він може повернутися 0xFFFFFFFFFFFFFFFF
?
Як щодо просто:
#include <io.h>
if(_access(path, 0) == 0)
... // file exists
Інший варіант: 'PathFileExists' .
Але я б, мабуть, пішов GetFileAttributes
.
PathFileExists
потрібно використовувати "Shlwapi.dll" (який недоступний у деяких версіях Windows) і трохи повільніший, ніж GetFileAttributes
.
Можна спробувати відкрити файл. Якщо це не вдалося, це означає, що не існує протягом більшості часу.
Інший більш загальний спосіб не для Windows:
static bool FileExists(const char *path)
{
FILE *fp;
fpos_t fsize = 0;
if ( !fopen_s(&fp, path, "r") )
{
fseek(fp, 0, SEEK_END);
fgetpos(fp, &fsize);
fclose(fp);
}
return fsize > 0;
}
_access(0)
.