FindFirstFile
От: BreakHeart  
Дата: 26.10.11 11:35
Оценка:
Подскажите пожалуйста!
Использую в консольном приложении функцию FindFirstFile для получения списка файлов, но если запустить данную прогу на английской винде, то напапках с русским имене вылетает ошибка(как это победить?
Re: FindFirstFile
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 11:55
Оценка:
Здравствуйте, BreakHeart, Вы писали:

BH>Подскажите пожалуйста!

BH>Использую в консольном приложении функцию FindFirstFile для получения списка файлов, но если запустить данную прогу на английской винде, то напапках с русским имене вылетает ошибка(как это победить?

Использовать FindFirstFileW.
Re[2]: FindFirstFile
От: BreakHeart  
Дата: 26.10.11 11:59
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, BreakHeart, Вы писали:


BH>>Подскажите пожалуйста!

BH>>Использую в консольном приложении функцию FindFirstFile для получения списка файлов, но если запустить данную прогу на английской винде, то напапках с русским имене вылетает ошибка(как это победить?

O>Использовать FindFirstFileW.

Его-то и использую, но всеравно с русскими папками на английской(не локализованной) винде работать не хочет
Re[3]: FindFirstFile
От: quodum  
Дата: 26.10.11 12:06
Оценка:
Здравствуйте, BreakHeart, Вы писали:

BH>>>Подскажите пожалуйста!

BH>>>Использую в консольном приложении функцию FindFirstFile для получения списка файлов, но если запустить данную прогу на английской винде, то напапках с русским имене вылетает ошибка(как это победить?

O>>Использовать FindFirstFileW.

BH>Его-то и использую, но всеравно с русскими папками на английской(не локализованной) винде работать не хочет

Тогда расскажите, какая именно ошибка и куда вылетает.
Re[3]: FindFirstFile
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 12:07
Оценка:
Здравствуйте, BreakHeart, Вы писали:

Да, показывайте код, потому что у меня тоже Винда английская и FindFirstFile работает.
Re[4]: FindFirstFile
От: BreakHeart  
Дата: 26.10.11 12:17
Оценка:
Ошибка:

26/10/2011 04:01__#__error__#__read "ܠ™溺Ø༸‰ߛ
ù拀矷" (FindFirstFile return 14219712) Error 2011641408__newline__


Код:

int DirFile(LPWSTR lpszDirFile, LPWSTR *filtFile, SYSTEMTIME mintimeFile,LPWSTR destination,LPWSTR action)
{
    WIN32_FIND_DATA c_file;
    HANDLE hFile;
    SYSTEMTIME systime;

    LPWSTR m_path = new wchar_t[_MAX_PATH];
    LPWSTR full_path = new wchar_t[_MAX_PATH];
    LPWSTR filtSmallMask, filtSmallFile;
    LPTSTR lpMsgBuf;
    

    wmemset(m_path,0,_MAX_PATH);
    wmemset(full_path,0,_MAX_PATH);

    lstrcpy(m_path,lpszDirFile);
    lstrcat(m_path,L"\\*");
    hFile = FindFirstFile(m_path, &c_file);
    SYSTEMTIME st;
    GetLocalTime(&st);

    if ( hFile == INVALID_HANDLE_VALUE)
    {

        SYSTEMTIME st;
        GetLocalTime(&st);

        save2file(syslog_full_path,L"%.2d/%.2d/%d %.2d:%.2d__#__error__#__read \"%s\" (FindFirstFile return %d) Error %d__newline__\n",
            st.wDay,
            st.wMonth,
            st.wYear,
            st.wHour,
            st.wMinute);

        if (!FormatMessage( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM | 
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            GetLastError(),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
            (LPTSTR) &lpMsgBuf,
            0,
            NULL ))
        {
        // Handle the error.
        printf("unknown error");
        }
        // Display the string.
        LPWSTR tmp = wcschr(lpMsgBuf,'\n');
        if(tmp)
            tmp--;
            *tmp = '\0';
        printf("%s", lpMsgBuf);
        // Free the buffer.
        LocalFree( lpMsgBuf );
        printf(")\n\n");
        //return -1;
    }
    else
    {
        do
        {
            if(c_file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && lstrcmp(c_file.cFileName,L".")!= 0 && lstrcmp(c_file.cFileName,L"..")!=0)
            {
                SYSTEMTIME st;
                GetLocalTime(&st);
                /*lstrcpy(full_path,lpszDirFile);
                if(lstrcmp(c_file.cAlternateFileName,L"") != 0)
                    lstrcat(full_path,c_file.cAlternateFileName);
                else
                    lstrcat(full_path,c_file.cFileName);
                lstrcat(full_path,L"\\");*/
                if(lstrcmp(c_file.cAlternateFileName,L"") != 0)
                    swprintf(full_path,L"%s%s%s",lpszDirFile,c_file.cAlternateFileName,L"\\");
                else
                    swprintf(full_path,L"%s%s%s",lpszDirFile,c_file.cFileName,L"\\");

                DirFile(full_path,filtFile,mintimeFile,destination,action);
            }
            else if(lstrcmp(c_file.cFileName,L".")!= 0 && lstrcmp(c_file.cFileName,L"..")!=0)
            {
                FileTimeToSystemTime(&c_file.ftLastWriteTime, &systime);
                if (lstrcmp(L"*", filtFile[0]) == 0){
                            if(_waccess_s(destination,0)!=0)
                            {
                                CreateDirectory(destination,NULL);
                            }
                            if(!wcsstr(destination,L"findir.log"))
                            {
                                SYSTEMTIME st;
                                GetLocalTime(&st);
                                LPWSTR date = new wchar_t[20];
                                wmemset(date,0,20);
                                swprintf(date,L"%.2d_%.2d_%d_%.2d_%.2d",st.wDay,st.wMonth,st.wYear,st.wHour,st.wMinute);
                                lstrcat(destination,L"\\findir.log");
                                lstrcat(destination,L"_");
                                lstrcat(destination,date);
                                delete [] date;
                            }
                            
                            LPWSTR tmp_df = new wchar_t[_MAX_PATH];
                            wmemset(tmp_df,0,_MAX_PATH);

                            lstrcpy(tmp_df,lpszDirFile);

                            save2file(destination,L"%s%s;%.2d/%.2d/%d;%dbytes;\n",del_char(tmp_df), c_file.cAlternateFileName,systime.wDay,systime.wMonth,systime.wYear,(c_file.nFileSizeHigh * MAXDWORD+1) + c_file.nFileSizeLow);

                            delete [] tmp_df;
                }
            }
        } while ( FindNextFile(hFile, &c_file) != 0 );

        SYSTEMTIME st;
        GetLocalTime(&st);
        FindClose(hFile);
    }
    delete [] m_path;
    delete [] full_path;
    return 0;
}
Re[5]: FindFirstFile
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 12:33
Оценка:
Здравствуйте, BreakHeart, Вы писали:

BH>Код:


BH>
BH>int DirFile(LPWSTR lpszDirFile, LPWSTR *filtFile, SYSTEMTIME mintimeFile,LPWSTR destination,LPWSTR action)
BH>{
BH>    // ...
BH>}
BH>


Вопрос — что передается в lpszDirFile и других параметрах ?
Бывает так, что литералы (на русском) закодированы прямо в исходниках, а при компиляции они
попадают в бинарник в совсем другом виде (кракозябрами).
Если вставить MessageBox в начале функции, передав ему lpszDirFile, что будет показано в окне ?
Re[6]: FindFirstFile
От: BreakHeart  
Дата: 26.10.11 12:36
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, BreakHeart, Вы писали:


BH>>Код:


BH>>
BH>>int DirFile(LPWSTR lpszDirFile, LPWSTR *filtFile, SYSTEMTIME mintimeFile,LPWSTR destination,LPWSTR action)
BH>>{
BH>>    // ...
BH>>}
BH>>


O>Вопрос — что передается в lpszDirFile и других параметрах ?

O>Бывает так, что литералы (на русском) закодированы прямо в исходниках, а при компиляции они
O>попадают в бинарник в совсем другом виде (кракозябрами).
O>Если вставить MessageBox в начале функции, передав ему lpszDirFile, что будет показано в окне ?
Изначально там передаётся имя диска, а потом туда подставляется еще и имя папки из cAlternateFileName
А разве MessageBox работает в консоли?
Re[7]: FindFirstFile
От: BreakHeart  
Дата: 26.10.11 12:44
Оценка:
MessageBox возвращает кракозябры и на lpszDirFile,и на cAlternateFileName
Re[8]: FindFirstFile
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 12:48
Оценка:
Здравствуйте, BreakHeart, Вы писали:

BH>MessageBox возвращает кракозябры и на lpszDirFile,и на cAlternateFileName


Ну так вот Вам и причина.
MessageBoxW — юникодная функция, способна отображать русские символы на любой локализации.
А у Вас она печатает кракозябры.
Значит, кракозябры получаются еще где-то до вызова функции.
Рискну предположить, что они у Вас задаются литералами прямо в коде программы, при том,
что сами исходники не в Unicode, вероятнее всего.
Re[9]: FindFirstFile
От: BreakHeart  
Дата: 26.10.11 12:53
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, BreakHeart, Вы писали:


BH>>MessageBox возвращает кракозябры и на lpszDirFile,и на cAlternateFileName


O>Ну так вот Вам и причина.

O>MessageBoxW — юникодная функция, способна отображать русские символы на любой локализации.
O>А у Вас она печатает кракозябры.
O>Значит, кракозябры получаются еще где-то до вызова функции.
O>Рискну предположить, что они у Вас задаются литералами прямо в коде программы, при том,
O>что сами исходники не в Unicode, вероятнее всего.

Так в том-то и проблема, что всё в юникоде.В параметрах проекта стоит юникод.Везде вызываются W-функции,а кракозябры возвращаются в cAlternateFileName функцией FindFirst(Next)File
Re[10]: FindFirstFile
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 12:56
Оценка:
Здравствуйте, BreakHeart, Вы писали:

BH>Так в том-то и проблема, что всё в юникоде.В параметрах проекта стоит юникод.Везде вызываются W-функции,а кракозябры возвращаются в cAlternateFileName функцией FindFirst(Next)File


Я имел в виду кодировку файлов .cpp, в которых у Вас исходный код программы.
Попробуйте сохранить их в UTF-16, а затем заново ввести все русские символы и пересобрать приложение.
Должно заработать, увидите.
Re: FindFirstFile
От: Pavel Dvorkin Россия  
Дата: 26.10.11 13:01
Оценка:
Здравствуйте, BreakHeart, Вы писали:

BH>Подскажите пожалуйста!

BH>Использую в консольном приложении функцию FindFirstFile для получения списка файлов, но если запустить данную прогу на английской винде, то напапках с русским имене вылетает ошибка(как это победить?

После установки Windows, но до того, как добавлена русская локаль через Control Panel , FAR показывает вместо русских имен знаки ????. Русский установлен ?
With best regards
Pavel Dvorkin
Re[11]: FindFirstFile
От: BreakHeart  
Дата: 26.10.11 13:02
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, BreakHeart, Вы писали:


BH>>Так в том-то и проблема, что всё в юникоде.В параметрах проекта стоит юникод.Везде вызываются W-функции,а кракозябры возвращаются в cAlternateFileName функцией FindFirst(Next)File


O>Я имел в виду кодировку файлов .cpp, в которых у Вас исходный код программы.

O>Попробуйте сохранить их в UTF-16, а затем заново ввести все русские символы и пересобрать приложение.
O>Должно заработать, увидите.
в исходниках никакого текста не вводится.прога при выполнении получает букву диска и начинает рекурсивно собирать имена файлов
Re[12]: FindFirstFile
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 13:20
Оценка:
Здравствуйте, BreakHeart.

Windows Server 2008 R2 (English):
#include <Windows.h>

int main()
{
    WIN32_FIND_DATAW wfd;
    HANDLE hFind = FindFirstFileW(L"E:\\*", &wfd);

    if (INVALID_HANDLE_VALUE == hFind)
    {
        MessageBoxW(NULL, L"FindFirstFileW failed.", L"Error", MB_ICONERROR);
        return EXIT_FAILURE;
    }

    do
    {
        MessageBoxW(NULL, wfd.cFileName, L"File", MB_OK);
    } while (NULL != FindNextFileW(hFind, &wfd));

    FindClose(hFind);
    return EXIT_SUCCESS;
}

Последовательно перечисляет папки на моем диске E — $RECYCLE.BIN, Documents and Settings,
Program Files, WINDOWS, а также (внимание!) Алёна, Фотки и другие, кириллицей.
Винда английская, в региональных настройках для программ, не поддерживающих юникод,
стоит "English (United States).
Re[13]: FindFirstFile
От: BreakHeart  
Дата: 26.10.11 13:27
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, BreakHeart.


O>Windows Server 2008 R2 (English):

O>
O>#include <Windows.h>

O>int main()
O>{
O>    WIN32_FIND_DATAW wfd;
O>    HANDLE hFind = FindFirstFileW(L"E:\\*", &wfd);

O>    if (INVALID_HANDLE_VALUE == hFind)
O>    {
O>        MessageBoxW(NULL, L"FindFirstFileW failed.", L"Error", MB_ICONERROR);
O>        return EXIT_FAILURE;
O>    }

O>    do
O>    {
O>        MessageBoxW(NULL, wfd.cFileName, L"File", MB_OK);
O>    } while (NULL != FindNextFileW(hFind, &wfd));

O>    FindClose(hFind);
O>    return EXIT_SUCCESS;
O>}
O>

O>Последовательно перечисляет папки на моем диске E — $RECYCLE.BIN, Documents and Settings,
O>Program Files, WINDOWS, а также (внимание!) Алёна, Фотки и другие, кириллицей.
O>Винда английская, в региональных настройках для программ, не поддерживающих юникод,
O>стоит "English (United States).

cFileName у меня тоже нормально отображается,а вот cAlternateFileName не хочет(
Re[14]: FindFirstFile
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 13:34
Оценка:
Здравствуйте, BreakHeart, Вы писали:

BH>cFileName у меня тоже нормально отображается,а вот cAlternateFileName не хочет(


Так это же формат 8.3 — чего же тут ожидать.
У меня, к примеру, папка "Фотки" в 8.3 отображается как 7866~1.
Re[15]: FindFirstFile
От: BreakHeart  
Дата: 26.10.11 13:48
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, BreakHeart, Вы писали:


BH>>cFileName у меня тоже нормально отображается,а вот cAlternateFileName не хочет(


O>Так это же формат 8.3 — чего же тут ожидать.

O>У меня, к примеру, папка "Фотки" в 8.3 отображается как 7866~1.
А можно как-нибудь получить короткое имя чтобы можно было обратиться к папке на другом языке?
Re[16]: FindFirstFile
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 13:57
Оценка:
Здравствуйте, BreakHeart, Вы писали:

BH>Здравствуйте, okman, Вы писали:


O>>Здравствуйте, BreakHeart, Вы писали:


BH>>>cFileName у меня тоже нормально отображается,а вот cAlternateFileName не хочет(


O>>Так это же формат 8.3 — чего же тут ожидать.

O>>У меня, к примеру, папка "Фотки" в 8.3 отображается как 7866~1.
BH>А можно как-нибудь получить короткое имя чтобы можно было обратиться к папке на другом языке?

Не понял.
Все, что связано с языковыми баръерами, преодолевается при помощи Unicode.
Никаких имен в стиле 8.3 или еще чего-то такого для этого не нужно.
У Вас где-то ошибка в коде (до вызова функции, которую Вы показывали), из-за этого проблема.
Кстати, из консоли кириллица по дефолту не показывается, нужно локаль задавать.
Можете глянуть, на всякий случай, вот сюда — http://www.rsdn.ru/forum/winapi/4467360.1.aspx
Автор: okman
Дата: 22.10.11
Re[10]: FindFirstFile
От: Banned by IT  
Дата: 26.10.11 18:59
Оценка:
Здравствуйте, BreakHeart, Вы писали:

BH>Везде вызываются W-функции

Похоже что это не так.
Попробуй везде принудительно написать W в конец имени функции.
Скорее всего у тебя вызываются A версии.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.