Я пытаюсь получить информацию о существующем файле, используя GetFileInformationByHandle()
. Моя функция, которая выполняет требуемую задачу, получает имя LPCTSTR Filename
качестве аргумента. Вот код:
getfileinfo(LPCTSTR Filename)
{
OFSTRUCT oo;
BY_HANDLE_FILE_INFORMATION lpFileInformation;
HFILE hfile=OpenFile((LPCSTR)Filename,&oo,OF_READ);
int err=GetLastError();
GetFileInfomationByHandle((HANDLE)hfile,&lpFileInformation);
}
Над кодом работает отлично, если я объявляю имя Filename
как LPCSTR
но по требованию моей функции я получаю имя файла в LPCTSTR
поэтому, если я использую typecasting, то openfile()
не может найти указанный файл и возвращает -1.
Может ли кто-нибудь сказать мне, как получить информацию о файле, если filename является LPCTSTR
? Или как преобразовать LPCTSTR
в LPCSTR
.
Почему это приведение не работает? Я считаю, что это должно сработать.
Решение вашей непосредственной проблемы заключается в замене OpenFile()
на CreateFile()
, как говорит документация OpenFile()
:
Примечание. Эта функция имеет ограниченные возможности и не рекомендуется. Для разработки новых приложений используйте функцию CreateFile.
Например:
getfileinfo(LPCTSTR Filename)
{
HANDLE hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
int err = GetLastError();
// handle error as needed ...
}
else
{
BY_HANDLE_FILE_INFORMATION FileInfo = {0};
BOOL ok = GetFileInformationByHandle(hFile, &FileInfo);
int err = GetLastError();
CloseHandle(hFile);
if (!ok)
{
// handle error as needed ...
}
else
{
// use FileInfo as needed...
}
}
}
Тем не менее, лучшим решением является не открытие файла вообще. Большая часть информации, возвращаемой GetFileInformationByHandle()
может быть получена с помощью FindFirstFile()
:
getfileinfo(LPCTSTR Filename)
{
WIN32_FIND_DATA FileData = {0};
HANDLE hFile = FindFirstFile(Filename, &FileData);
if (hFile == INVALID_HANDLE_VALUE)
{
int err = GetLastError();
// handle error as needed ...
}
else
{
FindClose(hFile);
// use FileData as needed ...
}
}
Простое наведение указателя не изменяет фактические данные (например, имя файла), на которые указывают на восьмибитные символы.
Чтение документов в MSDN предлагает вместо этого использовать CreateFile
, который обрабатывает имена файлов LPCTSTR.
Просмотрите свойства проекта/свойства конфигурации/общий/набор символов. Обычно это устанавливается в UNICODE. Его можно изменить на MBCS.
Если он установлен в MBCS, тогда код не нужно изменять.
Если он установлен в Unicode, который, как я подозреваю, иначе вы не будете задавать этот вопрос, используйте widechartomultibyte, чтобы преобразовать его из LPCTSTR (const wchar_t *) в LPSTR (const char *).
TCHAR
отTCHAR
и используйте широкие строковые версии всех функций Windows API.