【问题标题】:How to delete hidden files from a vector of file names?如何从文件名向量中删除隐藏文件?
【发布时间】:2015-08-26 23:34:14
【问题描述】:

在我正在编写的程序中,有一个函数可以从特定目录中获取所有文件名并将它们放入一个向量中,以便稍后在程序中使用它们。

但是,这也会抓取恰好位于文件夹中的所有隐藏文件。我试图让程序删除所有以“.”开头的文件,但这对我正在测试的文件夹不起作用(我仍然将“..”列为文件)。

这是代码部分:

while (handle != INVALID_HANDLE_VALUE)
{
     filenameList.push_back(search_data.cFileName);

    if (FindNextFile(handle, &search_data) == FALSE)
        break;
}

    //removes a lot of hidden files from the file list
    for (int i = 0; i < filenameList.size(); i++)
    {
        string hiddenCheck = filenameList[i];

        if (hiddenCheck[0] == '.') 
        {
            filenameList.erase(filenameList.begin() + i);
            i = 0;
        }

【问题讨论】:

  • 你试过调试你的代码吗? e.检查检测或擦除是否不起作用?
  • I still get ".." listed as a file 这不是隐藏文件,而是预期的行为。只需自己过滤掉“..”(以及“.”)(不,我不是指任何以点开头的东西,而只是点本身)
  • 我所说的隐藏文件都是以“.”开头的,比如“.thumbs”、“.dsstore”或“.bridge”。我尝试了各种方法来搜索文件名开头的点,比如使用 char 变量而不是字符串来搜索,但没有一个会删除所有隐藏文件。
  • 与其把隐藏的文件塞进vector然后取出来,不如早点测试,一开始就不放进去呢?还要考虑如果从列表中删除最后一项,for 循环的退出条件会发生什么。在您使用 Erase-Remove Idiom 时查看它。
  • 正如其他人所说,文件名中的点不会使任何东西隐藏在 Windows 中......

标签: c++ file vector hidden


【解决方案1】:

枚举文件时需要查看文件属性:

HANDLE handle = FindFirstFile(..., &search_data);
if (handle != NULL)
{
    do
    {
        // if not a directory, and not hidden...
        if ((search_data.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_HIDDEN)) == 0)
        {
            // add it to the list...
            filenameList.push_back(search_data.cFileName);
        }
    }
    while (FindNextFile(handle, &search_data));
    FindClose(handle);
}

【讨论】:

  • 供 OP 参考,这将排除 all 文件夹名称(即子文件夹),而不仅仅是以 '.' 开头的文件夹名称。如果你想保留 subdir 文件夹,只排除 ... 的别名,这仍然需要调整。
  • @WhozCraig:我认为 OP 不需要担心这一点,因为原始代码甚至没有处理子文件夹。 OP 的描述确实说他只想要文件名而不想要递归到子文件夹。
  • 不确定您所说的不处理子文件夹是什么意思。从 push_back 的外观来看,从 FindFirst/FindNext 循环返回的 所有内容 都被推入容器中,包括子目录名称。如果我推断这不会 recurse 进入子文件夹,那不是我的意图。我只是说 immediate 子目录文件夹名称根本不会包含在列表中。这就是全部了。抱歉,如果不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多