【问题标题】:Reading all files in two directories at the same time同时读取两个目录下的所有文件
【发布时间】:2017-11-17 10:06:29
【问题描述】:

我的任务有问题。我有两个目录路径。我可以从 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;
}

【问题讨论】:

  • 那个代码是c而不是c++。

标签: c file winapi


【解决方案1】:

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

当我在标题中看到“同时”时,我想到了“同时”。之后,我看到了提供的代码,并意识到它应该是“交错”而不是“并发”,但这不是必需的。

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

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

在使用FindFirstFile()/FindNextFile() 进行扫描时,您不应假定以任何有用的顺序获取文件名。这些函数以其“物理顺序”返回文件,即它们如何在内部列出。 (充其量,... 总是作为第一个条目,但我什至不会指望这一点。)

考虑到这一点,我会推荐以下程序:

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

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

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

  4. 处理数组names1names2

如您所见,“从目录中读取文件名并将它们存储在数组中”可以实现为函数并重用以及排序。

最后,这就是如何交错两个目录扫描的答案:

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;
  }
}

请注意,我“滥用”句柄 hFind1hFind2 本身进行循环重复。因此,我不需要额外的ifs。 (我喜欢这样的东西。)

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

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

while (hFind1 != INVALID_HANDLE_VALUE && hFind2 != INVALID_HANDLE_VALUE) {

如果至少一个目录扫描失败就终止循环。


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

当我开始将一个大目录从 CD 驱动器复制到硬盘时,我刚刚完成了(计算机科学)的学习,并且正在家里使用全新安装的 Windows NT 工作。估计时间大约是 1 小时,我想:‘嘿。它做多任务!因此,我启动了第二个文件管理器,同时从这个 CD 驱动器复制另一个目录。当我点击 OK 按钮时,CD 驱动器的提示音提醒了我,估计时间“爆炸”到了几个小时。在那之后,我表现得像预期的那样:轻拍我的额头,咕哝着诸如“不可共享的资源”之类的东西……(当然,停止了第二次复制,而是去喝咖啡。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 2016-10-20
    • 2013-12-02
    • 1970-01-01
    • 2018-06-06
    • 2021-02-24
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多