昨日のWindowsでファイル名を変更するプログラムをANSI版APIからUnicode版APIに書き換えた話で、
とりあえずリネーム処理以外のFindFirstFileというAPIのUnicode版FindFirstFileWを使ったフォルダとファイルをスキャンする使い方のサンプルコードっぽいのを晒してみる。
cmd.exeで動かすと文字化けするので、スタートメニューからPowershellを起動してPowershellで動かせば文字化けせずにUnicodeのフォルダ名やファイル名が正しく表示される。
#include <windows.h> #include <stdio.h> #include <string.h> #include <locale.h> #define FILENAME_LENGTH 4096 int scan(wchar_t *folder); int main(void) { wchar_t buf[FILENAME_LENGTH]; _wsetlocale(LC_ALL, L""); wcscpy(buf , L"\\\\?\\C:\\"); // C:\ or C:\Users\username\Desktop scan(buf); return 0; } int scan(wchar_t *folder) { HANDLE hFind; WIN32_FIND_DATAW win32fd; wchar_t filename1[FILENAME_LENGTH]; wchar_t filename2[FILENAME_LENGTH]; wcscpy(filename1 , folder); wcscat(filename1,L"\\*.*"); hFind = FindFirstFileW((LPCWSTR)filename1, &win32fd); if (hFind == INVALID_HANDLE_VALUE) { wprintf(L"Error: Folder not found. -> %ls \n",filename1); return 1; } do { if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if ( (wcscmp(win32fd.cFileName,L".")!=0)&&(wcscmp(win32fd.cFileName,L"..")!=0) ) { wcscpy(filename2 , folder); wcscat(filename2 , L"\\"); wcscat(filename2, win32fd.cFileName); wprintf(L">>folder: %ls \n", filename2); scan(filename2); } } else { wcscpy(filename2 , folder); wcscat(filename2 , L"\\"); wcscat(filename2, win32fd.cFileName); wprintf(L">>file: %ls \n", filename2); // Rename_check_and_exec(filename2); } } while (FindNextFileW(hFind, &win32fd)); FindClose(hFind); return 0; }