From 37ba2732554ffef0e588da4939c1b5448a227c2d Mon Sep 17 00:00:00 2001 From: Yutaka Sawada <60930312+Yutaka-Sawada@users.noreply.github.com> Date: Tue, 14 Mar 2023 10:45:32 +0900 Subject: [PATCH] Searching way of hidden files was changed --- source/sfv_md5/Command_sfv_md5.txt | 5 +++-- source/sfv_md5/common.c | 26 +++++++++++++++++++++++++- source/sfv_md5/common.h | 3 +++ source/sfv_md5/main.c | 28 ++++++++++++++++++++++------ 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/source/sfv_md5/Command_sfv_md5.txt b/source/sfv_md5/Command_sfv_md5.txt index ecae04d..506e408 100644 --- a/source/sfv_md5/Command_sfv_md5.txt +++ b/source/sfv_md5/Command_sfv_md5.txt @@ -1,4 +1,4 @@ -[ sfv_md5.exe - version 1.2.8.4 or later ] +[ sfv_md5.exe - version 1.3.2.8 or later ] Type "sfv_md5.exe" to see version and show usage below. @@ -64,7 +64,8 @@ A short filename in a path will be converted to long filename. If it is "*", all files in the specified directory are searched. If these are "*.txt" and "*.doc", files with extensions ".txt" and ".doc" in the specified directory are searched. -Hidden files are ignored by search. (you can add each by exact filename.) +When you don't see hidden files on Windows Explorer, they are ignored by search. +If you want to search hidden files, change Windows Explorer setting to see them. [input files] can be folder, though the folder itself is ignored. If it is "folder_name", files in the folder are searched. diff --git a/source/sfv_md5/common.c b/source/sfv_md5/common.c index 6861679..f72de4b 100644 --- a/source/sfv_md5/common.c +++ b/source/sfv_md5/common.c @@ -1,5 +1,5 @@ // common.c -// Copyright : 2022-01-20 Yutaka Sawada +// Copyright : 2023-03-14 Yutaka Sawada // License : The MIT license #ifndef _UNICODE @@ -16,6 +16,7 @@ #include #include +#include #include "common.h" @@ -1013,3 +1014,26 @@ void print_win32_err(void) LocalFree(lpMsgBuf); } +// エクスプローラーで隠しファイルを表示する設定になってるか調べる +unsigned int get_show_hidden(void) +{ + unsigned int rv; + SHELLSTATE ssf; + + // Explorer の設定を調べる + SHGetSetSettings(&ssf, SSF_SHOWALLOBJECTS | SSF_SHOWSUPERHIDDEN, FALSE); + // 隠しファイルを表示するかどうか + if (ssf.fShowAllObjects){ // 表示する設定なら + // 保護されたオペレーティングシステムファイルを表示するかどうか + if (ssf.fShowSuperHidden){ // 表示する設定なら + rv = 0; + } else { // 隠し属性とシステム属性の両方で判定する + rv = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM; + } + } else { // 隠しファイルを表示しない場合は、隠し属性だけで判定する + rv = FILE_ATTRIBUTE_HIDDEN; + } + + return rv; +} + diff --git a/source/sfv_md5/common.h b/source/sfv_md5/common.h index 32b5f02..cc4ad05 100644 --- a/source/sfv_md5/common.h +++ b/source/sfv_md5/common.h @@ -137,3 +137,6 @@ void print_progress_done(void); // Win32 API のエラー・メッセージを表示する void print_win32_err(void); +// エクスプローラーで隠しファイルを表示する設定になってるか調べる +unsigned int get_show_hidden(void); + diff --git a/source/sfv_md5/main.c b/source/sfv_md5/main.c index ab38cba..90d75d6 100644 --- a/source/sfv_md5/main.c +++ b/source/sfv_md5/main.c @@ -1,5 +1,5 @@ // main.c -// Copyright : 2022-02-25 Yutaka Sawada +// Copyright : 2023-03-14 Yutaka Sawada // License : The MIT license #ifndef _UNICODE @@ -99,7 +99,12 @@ static wchar_t * search_files( wchar_t *list_buf, // ファイル・リスト wchar_t *search_path, // 検索するファイルのフル・パス long dir_len, // ディレクトリ部分の長さ - long file_only, // ファイルのみにするかどうか + //long file_only, // ファイルのみにするかどうか + + unsigned int filter, // 2, FILE_ATTRIBUTE_HIDDEN = 隠しファイルを無視する + // 4, FILE_ATTRIBUTE_SYSTEM = システムファイルを無視する + // 16, FILE_ATTRIBUTE_DIRECTORY = ディレクトリを無視する + long single_file, // -1 = *や?で検索指定、0~ = 単独指定 long *list_max, // ファイル・リストの確保サイズ long *list_len, // ファイル・リストの文字数 @@ -107,9 +112,15 @@ static wchar_t * search_files( { wchar_t *tmp_p; long len, l_max, l_off, dir_len2; + unsigned int attrib_filter; HANDLE hFind; WIN32_FIND_DATA FindData; + // 隠しファイルを見つけるかどうか + attrib_filter = filter & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM); + if (attrib_filter == 0) + attrib_filter = INVALID_FILE_ATTRIBUTES; + if (list_buf == NULL){ l_off = 0; l_max = ALLOC_LEN; @@ -128,7 +139,7 @@ static wchar_t * search_files( if (hFind == INVALID_HANDLE_VALUE) return list_buf; // 見つからなかったらそのまま do { - if ((single_file < 0) && (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + if ((single_file < 0) && ((FindData.dwFileAttributes & attrib_filter) == attrib_filter)) continue; // 検索中は隠し属性が付いてるファイルを無視する len = wcslen(FindData.cFileName); @@ -144,14 +155,14 @@ static wchar_t * search_files( // フォルダなら if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ - if ((file_only == 0) && wcscmp(FindData.cFileName, L".") && wcscmp(FindData.cFileName, L"..")){ + if (((filter & FILE_ATTRIBUTE_DIRECTORY) == 0) && wcscmp(FindData.cFileName, L".") && wcscmp(FindData.cFileName, L"..")){ // フォルダの末尾は「\」にする wcscat(search_path, L"\\"); // そのフォルダの中身を更に検索する dir_len2 = wcslen(search_path); search_path[dir_len2 ] = '*'; // 末尾に「*」を追加する search_path[dir_len2 + 1] = 0; - list_buf = search_files(list_buf, search_path, dir_len2, file_only, single_file, &l_max, &l_off, total_size); + list_buf = search_files(list_buf, search_path, dir_len2, filter, single_file, &l_max, &l_off, total_size); if (list_buf == NULL){ FindClose(hFind); printf("cannot search inner folder\n"); @@ -761,6 +772,11 @@ fo= switch_set & 0x00000020 wchar_t *list_buf; long dir_len, list_len, list_max; __int64 total_size = 0; // 合計ファイル・サイズ + unsigned int filter; + // 隠しファイルやフォルダーを無視するかどうか + filter = get_show_hidden(); + if (switch_set & 0x20) + filter |= FILE_ATTRIBUTE_DIRECTORY; // チェックサム・ファイル作成ならソース・ファイルのリストがいる i++; if (i >= argc){ @@ -797,7 +813,7 @@ fo= switch_set & 0x00000020 while (file_path[dir_len] != '\\') dir_len--; dir_len++; - list_buf = search_files(list_buf, file_path, dir_len, switch_set & 0x20, j, &list_max, &list_len, &total_size); + list_buf = search_files(list_buf, file_path, dir_len, filter, j, &list_max, &list_len, &total_size); if (list_buf == NULL) return 1; if ((j != -1) && (j == file_num)){ // ファイルが見つかったか確かめる