バックアップソフトを作っているのですが
FindFirstFile FindNextFile 関数で階層的に指定したフォルダ以下のファイル構造を取得
しようとしています
現在動作テスト中なのですが Cドライブの ProgramFiles フォルダと Windows ファルダの
取得ファイル数、フォルダ数が計算結果と一致しないのです
検証の方法はフォルダを右クリック→プロパティでファイル数、フォルダ数をチェック
その後、自作のファイル構造取得プログラムでメッセージボックスにてファイル数、フォルダ数を
確認しているのですが、どうしても上記の2フォルダのみ異なった値になります
色々、調べたところセキュリティソフトのフォルダにはアクセスできなくなっていてて
それが原因で以下のファイル構造が取得できないのかなと考えています
どうすれば、きちんとファイル構造を取得できるのでしょうか?
また、システムフォルダにはアクセスできないのでしょうか?
バックアップソフトを作っているのですが
Re:バックアップソフトを作っているのですが
昔作ったソフトで似たようなことをしていたので、ちょっと改造して指定フォルダ以下のフォルダ数とファイル数を求めるプログラムを組んでみました。
システムファイルとか隠しファイルとかも特に問題なくアクセスできています。
私の環境ではProgram Filesではプロパティと同じ結果になりました。
WINDOWSでは、アプリのほうがフォルダ数+2、ファイル数+1と若干誤差がありました。
システムファイルとか隠しファイルとかも特に問題なくアクセスできています。
私の環境ではProgram Filesではプロパティと同じ結果になりました。
WINDOWSでは、アプリのほうがフォルダ数+2、ファイル数+1と若干誤差がありました。
#include <iostream> using namespace std; #include <Windows.h> #include <shlwapi.h> // PathRemoveFileSpec() #pragma comment(lib, "shlwapi.lib") // PathRemoveFileSpec() void FileSearch( char *ppath, int *num_dir, int *num_file ) { HANDLE hFind; WIN32_FIND_DATA fd; /* 最初のファイル検索 */ hFind = FindFirstFile(ppath, &fd); /* 検索失敗? */ if(hFind == INVALID_HANDLE_VALUE) { printf("検索失敗\n"); return; /******** エラー終了 ********/ } PathRemoveFileSpec(ppath); do { /* 結果の表示 */ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if ((strcmp(fd.cFileName, ".")) && (strcmp(fd.cFileName, ".."))) { printf("%08d ディレクトリ名: %s\n", *num_dir, fd.cFileName); (*num_dir)++; // ディレクトリ内の探索 char nextpath[MAX_PATH]; sprintf(nextpath, "%s\\%s\\*.*", ppath, fd.cFileName); FileSearch(nextpath, num_dir, num_file); } } else { printf("%08d ファイル名: %s\n", *num_file, fd.cFileName); (*num_file)++; } } while(FindNextFile(hFind, &fd)); //次のファイルを検索 /* 検索終了 */ FindClose(hFind); return; } int main(int argc, char *argv[/url]) { int num_dir = 0; int num_file = 0; char path[MAX_PATH]; sprintf(path, "%s\\*.*", argv[1]); FileSearch(path, &num_dir, &num_file); printf("dir = %d, file = %d\n", num_dir, num_file); return 0; }
Re:バックアップソフトを作っているのですが
バックアップですか……。相当やっかいな分野だと思うのですが……。
とりあえず,SeBackupPrivilege特権を有効にしてみてください。
SeBackupPrivilege特権を持っていれば,ACLを無視して読み込みが行えるはずです。
http://msdn.microsoft.com/en-us/library/bb530716.aspx
http://www.differentpla.net/content/200 ... ackup-name
とりあえず,SeBackupPrivilege特権を有効にしてみてください。
SeBackupPrivilege特権を持っていれば,ACLを無視して読み込みが行えるはずです。
http://msdn.microsoft.com/en-us/library/bb530716.aspx
http://www.differentpla.net/content/200 ... ackup-name
Re:バックアップソフトを作っているのですが
Mistさん回答ありがとうございます
ちょっと改造して表示したのですが Program Files のファイル数は一致したのですが
C:\Windows フォルダは1~2個の誤差がでますね
はじめに断っておけばよかったのですが、システムファイルはバックアップする予定でなく
自分の作ったソースコードの自動バックアップ機能が欲しかったのです
なのでこれで良しとしておきます
アクセス権限なども絡んでくるんですね
英語の解説は読めないのでちょっと諦めておきます
わざわざ海外までありがとうございました
ちょっと改造して表示したのですが Program Files のファイル数は一致したのですが
C:\Windows フォルダは1~2個の誤差がでますね
はじめに断っておけばよかったのですが、システムファイルはバックアップする予定でなく
自分の作ったソースコードの自動バックアップ機能が欲しかったのです
なのでこれで良しとしておきます
#include <iostream> using namespace std; #include <Windows.h> #include <shlwapi.h> // PathRemoveFileSpec() #pragma comment(lib, "shlwapi.lib") // PathRemoveFileSpec() void FileSearch( char *ppath, int *num_dir, int *num_file ) { HANDLE hFind; WIN32_FIND_DATA fd; /* 最初のファイル検索 */ hFind = FindFirstFile(ppath, &fd); /* 検索失敗? */ if(hFind == INVALID_HANDLE_VALUE) { printf("検索失敗\n"); return; /******** エラー終了 ********/ } PathRemoveFileSpec(ppath); do { /* 結果の表示 */ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if ((strcmp(fd.cFileName, ".")) && (strcmp(fd.cFileName, ".."))) { // printf("%08d ディレクトリ名: %s\n", *num_dir, fd.cFileName); (*num_dir)++; // ディレクトリ内の探索 char nextpath[MAX_PATH]; sprintf(nextpath, "%s\\%s\\*.*", ppath, fd.cFileName); FileSearch(nextpath, num_dir, num_file); } } else { // printf("%08d ファイル名: %s\n", *num_file, fd.cFileName); (*num_file)++; } } while(FindNextFile(hFind, &fd)); //次のファイルを検索 /* 検索終了 */ FindClose(hFind); return; } int main(int argc, char *argv[/url]) { int num_dir = 0; int num_file = 0; char path[MAX_PATH]; wsprintf( path, "%s\\*", "C:\\WINDOWS" ); // sprintf(path, "%s\\*.*", argv[1]); FileSearch(path, &num_dir, &num_file); printf("dir = %d, file = %d\n", num_dir, num_file); return 0; }YuO さん回答ありがとうございます
アクセス権限なども絡んでくるんですね
英語の解説は読めないのでちょっと諦めておきます
わざわざ海外までありがとうございました