WindowsでUnicode版のFindFirstFileのAPIを使ってみたサンプルコード

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



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

59 − 51 =