Преобразование LPCTSTR в LPCSTR

0

Я пытаюсь получить информацию о существующем файле, используя 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.

Почему это приведение не работает? Я считаю, что это должно сработать.

  • 2
    TCHAR от TCHAR и используйте широкие строковые версии всех функций Windows API.
  • 0
    Проблема здесь в том, что широкоформатная версия OpenFile не существует.
Показать ещё 1 комментарий
Теги:
string
winapi
file-handling

3 ответа

3
Лучший ответ

Решение вашей непосредственной проблемы заключается в замене 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 ...
    }
}
4

Простое наведение указателя не изменяет фактические данные (например, имя файла), на которые указывают на восьмибитные символы.

Чтение документов в MSDN предлагает вместо этого использовать CreateFile, который обрабатывает имена файлов LPCTSTR.

0

Просмотрите свойства проекта/свойства конфигурации/общий/набор символов. Обычно это устанавливается в UNICODE. Его можно изменить на MBCS.

Если он установлен в MBCS, тогда код не нужно изменять.

Если он установлен в Unicode, который, как я подозреваю, иначе вы не будете задавать этот вопрос, используйте widechartomultibyte, чтобы преобразовать его из LPCTSTR (const wchar_t *) в LPSTR (const char *).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню