バックアップソフトを作っているのですが

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

バックアップソフトを作っているのですが

#1

投稿記事 by dic » 16年前

バックアップソフトを作っているのですが
FindFirstFile FindNextFile 関数で階層的に指定したフォルダ以下のファイル構造を取得
しようとしています
現在動作テスト中なのですが Cドライブの ProgramFiles フォルダと Windows ファルダの
取得ファイル数、フォルダ数が計算結果と一致しないのです
検証の方法はフォルダを右クリック→プロパティでファイル数、フォルダ数をチェック
その後、自作のファイル構造取得プログラムでメッセージボックスにてファイル数、フォルダ数を
確認しているのですが、どうしても上記の2フォルダのみ異なった値になります

色々、調べたところセキュリティソフトのフォルダにはアクセスできなくなっていてて
それが原因で以下のファイル構造が取得できないのかなと考えています

どうすれば、きちんとファイル構造を取得できるのでしょうか?
また、システムフォルダにはアクセスできないのでしょうか?

Mist

Re:バックアップソフトを作っているのですが

#2

投稿記事 by Mist » 16年前

昔作ったソフトで似たようなことをしていたので、ちょっと改造して指定フォルダ以下のフォルダ数とファイル数を求めるプログラムを組んでみました。
システムファイルとか隠しファイルとかも特に問題なくアクセスできています。
私の環境では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;
}

YuO

Re:バックアップソフトを作っているのですが

#3

投稿記事 by YuO » 16年前

バックアップですか……。相当やっかいな分野だと思うのですが……。

とりあえず,SeBackupPrivilege特権を有効にしてみてください。
SeBackupPrivilege特権を持っていれば,ACLを無視して読み込みが行えるはずです。
http://msdn.microsoft.com/en-us/library/bb530716.aspx
http://www.differentpla.net/content/200 ... ackup-name

dic

Re:バックアップソフトを作っているのですが

#4

投稿記事 by dic » 16年前

Mistさん回答ありがとうございます
ちょっと改造して表示したのですが 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 さん回答ありがとうございます
アクセス権限なども絡んでくるんですね
英語の解説は読めないのでちょっと諦めておきます
わざわざ海外までありがとうございました

dic

Re:バックアップソフトを作っているのですが

#5

投稿記事 by dic » 16年前

うまくいかなかったソース載せておきます
環境はVC++6です

閉鎖

“C言語何でも質問掲示板” へ戻る