同时读取两个目录中的所有文件

时间:2017-11-17 10:06:30

标签: c file winapi

我的任务有问题。我有两个目录路径。我可以从argv [1]的第一个路径读取所有文件,但不能从argv [2]的第二个文件夹中打开文件。文件数量相等。开始在数组中写入fales名称的方式失败了,因为它们大约有几百个。我有一个例子,我尝试读取文件。需要帮忙。谢谢!

#include "stdafx.h"
#include "windows.h"

int main(int argc, char* argv[])
{
    FILE   *fp = 0;
    uchar  tmpl1[BUFFER_SIZE] = { 0 };
    uchar tmpl2[BUFFER_SIZE] = { 0 };
    size_t size;
    size_t n;
    FILE   *Fl = 0;

    if (argc != 3 || argv[1] == NULL || argv[2] == NULL)
    {
        printf("Error", argv[0]);
        return -1;
    }

    char            Fn[255];
    HANDLE          hFind;
    WIN32_FIND_DATA ff;

    char            Fn1[255];
    HANDLE          hFind1;
    WIN32_FIND_DATA ff1;


    sprintf_s(Fn, 255, "%s\\*", argv[1]); 
    sprintf_s(Fn1, 255, "%s\\*", argv[2]);


    if ((hFind = FindFirstFile(Fn, &ff)) != INVALID_HANDLE_VALUE)
    {
                if ((hFind1 = FindFirstFile(Fn1, &ff1)) != INVALID_HANDLE_VALUE)
        {
            do
            {
                if (ff.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;
                ff1.dwFileAttributes;
                sprintf_s(Fn, "%s\\%s", argv[1], ff.cFileName);
                sprintf_s(Fn1, "%s\\%s", argv[2], ff1.cFileName);
                // here I can't read file's name from second folder
                printf(Fn, "%s\\%s", argv[1], ff.cFileName);
                                printf(Fn1, "%s\\%s", argv[2], ff1.cFileName);

                if (fopen_s(&fp, Fn, "rb") != 0)
                {
                    printf("Error reading\nUsage: %s <tmpl1>\n", argv[1]);
                    return -1;
                }
                size = _filelength(_fileno(fp));
                n = fread(tmpl1, size, 1, fp);
                fclose(fp);
                fp = 0;

            } while (FindNextFile(hFind, &ff)); 
            // also I have a problem how read next file in second directory 
            FindClose(hFind);
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我没有读到你为什么要同时扫描两个目录。

当我在同一时间看到&#34;&#34;在标题中我认为&#34;同时&#34;。之后,我看到了所呈现的代码并意识到它应该完成并且#34;交错&#34;而不是&#34;同时&#34;但这不是必需的。

我假设您要将第一个目录中的文件名以某种方式与第二个目录中的文件名相关联。这可能是比较文件名,从第一个目录的文件读取数据和从第二个目录的相关文件中读取其他数据,或者可能是完全不同的东西。

但是,基于这个假设,您必须考虑:

使用FindFirstFile() / FindNextFile()进行扫描时,您不应假设获取任何有用顺序的文件名。这些函数以&#34;物理顺序返回文件&#34;即它们如何在内部列出。 (最好,您始终将...作为第一个条目,但我甚至不会指望这一点。)

考虑到这一点,我建议采用以下程序:

  1. 从第一个目录中读取文件名并将其存储在数组names1

  2. 从第二个目录中读取文件名并将其存储在数组names2

  3. 使用适当的标准(例如按字典顺序排序)对数组names1names2进行排序

  4. 处理数组names1names2

  5. 如您所见,&#34;从目录中读取文件名并将它们存储在数组中&#34;可以实现为功能和重用以及排序。

    最后,这说明了如何交错两个目录扫描的答案:

    HANDLE hFind1 = FindFirstFile(Fn1, &ff1);
    HANDLE hFind2 = FindFirstFile(Fn2, &ff2);
    while (hFind1 != INVALID_HANDLE_VALUE || hFind2 != INVALID_HANDLE_VALUE) {
      if (hFind1 != INVALID_HANDLE_VALUE) {
        /** @todo process ff1 somehow */
      }
      if (hFind2 != INVALID_HANDLE_VALUE) {
        /** @todo process ff2 somehow */
      }
      /* iterate: */
      if (!FindNextFile(hFind1, &ff1)) {
        FindClose(hFind1); hFind1 = INVALID_HANDLE_VALUE;
      }
      if (!FindNextFile(hFind2, &ff2)) {
        FindClose(hFind2); hFind2 = INVALID_HANDLE_VALUE;
      }
    }
    

    请注意我&#34;滥用&#34;句柄hFind1hFind2本身用于循环重复。因此,我不需要额外的if s。 (我喜欢这样的事情。)

    顺便说一下。这个循环迭代,直到两个目录被完全扫描(即使它们不包含相同数量的条目)。

    如果您想要迭代,直到完全扫描至少一个目录,您只需将while条件更改为:

    即可实现此目的
    while (hFind1 != INVALID_HANDLE_VALUE && hFind2 != INVALID_HANDLE_VALUE) {
    

    如果至少一次目录扫描失败,则应终止循环。

    最后,我自己过去的一个小故事(我在那里学到了有用的一课):

    我刚刚完成了我的学习(计算机科学),当我开始将一个大型目录从CD驱动器复制到硬盘时,我正在一个新安装的Windows NT上工作。估计时间是大约1小时,我想:&#39;嘿。它做多任务!&#39;因此,我启动了第二个文件管理器来从此CD驱动器同时复制另一个目录。当我按下OK按钮时,CD驱动器的提示噪音提醒我以及估计的爆炸时间&#34;多个小时。在那之后,我表现得很期待:轻拍我的额头,嘟something了类似于&#34;不可分享的资源&#34; ...(当然,停止了第二次复制并转而去喝咖啡。)