昨日の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;
}