-1

特定のフォルダー内のすべてのファイルを暗号化しようとしていますが、そのフォルダーにはサブフォルダーがあり、すべてのファイルを印刷しようとするとうまくいきますが、すべてのファイルを暗号化しようとすると、同じファイルが何度も暗号化され続けます

void dirListFiles(wchar_t *startDir) {
HANDLE hFind;
WIN32_FIND_DATA wfd;
wchar_t path[99999];
char *enName;
const char *extension = ".enc";
int wcsChars;

wsprintf(path, L"%s\\*", startDir);

if ((hFind = FindFirstFile(path, &wfd)) == INVALID_HANDLE_VALUE) {
    return;
}

do {
    if ((wcsncmp(L".", wfd.cFileName, 1) !=0) && (wcsncmp(L"..", wfd.cFileName, 2) != 0) ) {
        wsprintf(path, L"%s\\%s", startDir, wfd.cFileName);
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            dirListFiles(path);
        } else {
            wcsChars = wcslen(path);
            char *szTo = new char[wcsChars + 1];
            szTo[wcsChars] = '\0';
            WideCharToMultiByte(CP_ACP, 0, path, -1, szTo, wcsChars, NULL, NULL);

            enName = (char *)malloc(strlen(szTo) + 1 + 4);
            strcpy(enName, szTo);
            strcat(enName, extension);
            // If i add this line it keeps on encrypting the same file
            //fencrypt(szTo, enName, (unsigned const char*)"1234567812345678");

            printf("%s\n", enName);

            delete[] szTo;
            free(enName);
        }
    }
} while(FindNextFile(hFind, &wfd));

if (GetLastError() != ERROR_NO_MORE_FILES) {
    FindClose(hFind);
    return;
}
}

fencrypt(szTo, enName, (unsigned const char*)"1234567812345678"); を追加すると、次に、メインフォルダー内のファイルを暗号化しますが、G:\WinApp入るG:\WinApp\ipch\winapp-1918e0a3と同じファイルを何度も暗号化し続けG:\WinApp\ipch\ます フォルダーのみにファイルがありませんwinapp-1918e0a3これは私の暗号化機能です どこが間違っているのか教えてください

void fencrypt(char* read, char* write, const unsigned char* enc_key) {
RAND_bytes(iv, AES_BLOCK_SIZE);

readFile = fopen(read,"rb");
writeFile = fopen(write,"wb");

fwrite(iv, 1, 8, writeFile);
fwrite("\0\0\0\0\0\0\0\0", 1, 8, writeFile);

AES_set_encrypt_key(enc_key, 256, &key);

init_ctr(&state, iv);
while(1) {
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, readFile); 
    AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);

    bytes_written = fwrite(outdata, 1, bytes_read, writeFile); 
    if (bytes_read < AES_BLOCK_SIZE) {
        break;
    }
}

fclose(writeFile);
fclose(readFile);
}
4

2 に答える 2

1

FindNextFile100% 確実とは言えませんが、ディレクトリに新しいファイルを作成すると、実際には同じファイルではないため、混乱して同じファイル名が再び検出されるような気がします。ディレクトリ内のすべてのファイルのリストを収集して一度に 1 つずつ処理するか、または既に実行したことのリストを保持して、実行したファイルをスキップする必要がある場合があります。

于 2013-09-10T11:23:23.517 に答える
0

呼び出しではFindNextFile、新しく出現した暗号化ファイルが表示される可能性が高いため、新しいファイルも処理し続けます。

暗号化されたファイルに「.enc」拡張子を追加しているため、既にこの拡張子が付いているファイルをスキップするのは比較的簡単です。

于 2013-09-10T11:24:01.783 に答える