windows 下面 查找一个文件夹下的所有文件。整理版

本文介绍了两种在VC和VS环境下搜索指定目录下特定文件的方法,包括遍历文件、过滤文件类型以及关闭文件查找器。

//----------第一种方法,可以再vc6.0上直接运行---------------------------------------------

#include <AFX.H>

void FindFilesInOneFolder(const std::string folder_in, vector <string>& files_out)
{
// 0. Initialize
int q=0;
string lastStr;
CFileFind finder;

// build a string with wildcards
CString str_root(folder_in.c_str());
CString str=str_root+_T("\\*.*");
CString filename;

// 1. Start working for files
BOOL bWorking = finder.FindFile(str);

while (bWorking)
{
// 2.
bWorking = finder.FindNextFile();

// 3. skip . and .. files; 
if (finder.IsDots())
continue;

// 4. if it's a directory, go inside it
if (finder.IsDirectory())
{
/*FindFilesInOneFolder((LPCTSTR)(finder.GetFilePath()),files_out);*/
continue;
}
else
// 5. Get filename
{
filename=finder.GetFilePath();
string ss=filename.GetBuffer(0);

q=ss.find_last_of('.');
lastStr=ss.substr(q,ss.size()-q);
if ((lastStr==".jpg") ||(lastStr==".bmp"))
{
files_out.push_back(ss);
}

}

}

// 6. Finished
finder.Close();
// return;

}


//----------第二种方法,可在vs2008上直接运行---------------------------------------------

#include <Windows.h>

void FindFilesInOneFolder(const std::string lpPath, std::vector <std::string>& files_out)
{

WIN32_FIND_DATA FindFileData;
HANDLE hFind=NULL;


string filePathName;
string fullPathName;


filePathName=lpPath+"\\*.*";
 
hFind=FindFirstFile(filePathName.data(),&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
return;
do 
{
if ( "." == (string)FindFileData.cFileName || ".." == (string)FindFileData.cFileName )
{
continue;
}


fullPathName=lpPath+"\\"+FindFileData.cFileName;
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
/*FindFilesInOneFolder(fullPathName,files_out);*/
continue;
}
else
{
string str_tmp=fullPathName.substr(fullPathName.length()-3);
if ("jpg"==str_tmp || "bmp"==str_tmp || "ppm"==str_tmp)
{
files_out.push_back(fullPathName);
}


}
} while (FindNextFile(hFind,&FindFileData));

    FindClose(hFind);


}

<think>根据用户需求,我们需要删除指定文件夹下所有空的子文件夹(包括嵌套的空文件夹)。参考提供的引用内容,我们可以使用Python的`os`模块来实现。 ### 解决方案思路 1. **遍历目录树**:使用`os.walk`以自底向上(bottom-up)的方式遍历目录,这样可以在处理父目录之前先处理子目录,确保当父目录因删除子目录而变空时也能被正确删除。 2. **检查文件夹是否为空**:对于每个遍历到的文件夹,检查它是否不包含任何文件和子文件夹(注意:即使有子文件夹,如果子文件夹已经被删除,那么当前文件夹可能变为空)。 3. **删除空文件夹**:如果文件夹为空,则使用`os.rmdir`删除。 ### Python代码实现 ```python import os def delete_empty_folders(directory): """ 删除指定目录下所有空的子文件夹(包括嵌套的空文件夹) 参数: directory: 要清理的根目录路径 """ deleted = set() # 用于记录已删除的文件夹,避免重复操作 # 使用os.walk自底向上遍历 for root, dirs, files in os.walk(directory, topdown=False): # 遍历当前目录下的所有子文件夹 for dir_name in dirs: folder_path = os.path.join(root, dir_name) # 检查文件夹是否已经被删除(避免重复删除) if folder_path in deleted: continue # 检查文件夹是否为空 if not os.listdir(folder_path): try: os.rmdir(folder_path) deleted.add(folder_path) print(f"已删除空文件夹: {folder_path}") except OSError as e: print(f"删除失败: {folder_path} - {e}") print("清理完成。") # 使用示例 if __name__ == "__main__": target_directory = r"E:\test" # 替换为你的目标目录 delete_empty_folders(target_directory) ``` ### 代码说明 1. **自底向上遍历**:通过设置`topdown=False`,确保先处理叶子节点(最深层的文件夹),再处理父节点。 2. **检查空文件夹**:`os.listdir(folder_path)`返回文件夹内的所有条目(包括文件和子文件夹)。如果返回空列表,则说明该文件夹为空。 3. **删除操作**:使用`os.rmdir()`删除空文件夹。注意:此函数只能删除空文件夹,如果文件夹非空则会引发`OSError`。 4. **避免重复删除**:使用集合`deleted`记录已删除的文件夹路径,防止因遍历顺序导致的重复删除尝试(尽管在自底向上遍历中通常不会发生,但这是额外的保护)。 ### 注意事项 1. **权限问题**:确保程序有足够的权限删除目标文件夹。 2. **只读文件**:如果文件夹中包含只读文件,则可能无法删除。但我们的代码只删除空文件夹,所以不会遇到文件只读问题(因为空文件夹没有文件)。 3. **符号链接**:`os.walk`默认不会跟随符号链接。如果目录中有指向文件夹的符号链接,它们不会被遍历,因此不会影响删除逻辑。 4. **删除不可逆**:请谨慎操作,确保目标目录正确,或者提前备份重要数据。 ### 高级扩展 如果需要更严格的安全检查,可以在删除前确认文件夹确实是目录并且为空: ```python if os.path.isdir(folder_path) and not os.listdir(folder_path): # 执行删除 ``` ### 相关问题 1. 如何批量删除指定类型的文件? 2. 如何统计文件夹中每种文件类型的数量? 3. 如何将文件夹按照文件类型整理到不同子文件夹中? 4. 如何查找并删除重复文件? ### 参考引用 [^1]: 使用`os.walk`自底向上遍历并删除空文件夹的方法。 [^2]: 检查文件夹是否为空的条件:`not dirs and not files`(但注意,在自底向上遍历中,子文件夹可能已被删除,因此需要重新检查)。</think># 删除文件夹下所有空子文件夹的解决方案 根据您的需求,我将提供一个完整的Python解决方案来删除指定文件夹下所有空的子文件夹(包括嵌套的空子文件夹)。 ## 解决方案思路 1. **递归遍历目录**:使用`os.walk`自底向上遍历目录树,确保先处理子目录再处理父目录 2. **检查文件夹是否为空**:判断文件夹中是否既没有文件也没有子文件夹 3. **安全删除空文件夹**:使用`os.rmdir`删除符合条件的空文件夹 4. **错误处理**:添加异常处理机制,防止因权限问题导致程序中断 ## Python代码实现 ```python import os def delete_empty_subfolders(root_dir): """ 删除指定目录下所有空的子文件夹(包括嵌套的空子文件夹) 参数: root_dir: 要清理的根目录路径 """ deleted_count = 0 # 使用os.walk自底向上遍历目录树 for current_dir, subdirs, files in os.walk(root_dir, topdown=False): # 跳过根目录本身 if current_dir == root_dir: continue # 检查当前目录是否为空 if not subdirs and not files: try: os.rmdir(current_dir) print(f"已删除空文件夹: {current_dir}") deleted_count += 1 except OSError as e: print(f"删除失败: {current_dir} - {e.strerror}") print(f"\n操作完成! 共删除 {deleted_count} 个空文件夹") if __name__ == "__main__": # 配置目标目录 - 请替换为您的实际路径 target_directory = "/path/to/your/target/directory" # 安全确认 confirm = input(f"即将删除 {target_directory} 下所有空子文件夹,是否继续? (y/n): ") if confirm.lower() == 'y': delete_empty_subfolders(target_directory) else: print("操作已取消") ``` ## 使用说明 1. **设置目标目录**: - 修改代码中的 `target_directory` 变量为您的实际目录路径 - Windows路径示例:`r"C:\Users\YourName\Documents"` - Linux/Mac路径示例:`"/home/yourname/documents"` 2. **运行脚本**: - 将代码保存为 `delete_empty_folders.py` - 执行命令: ```bash python delete_empty_folders.py ``` 3. **功能特点**: - 自底向上遍历确保正确处理嵌套空文件夹 - 详细的操作日志输出 - 安全确认机制防止误操作 - 异常处理避免程序意外终止 - 自动跳过根目录本身 ## 数学原理说明 该算法基于深度优先搜索(DFS)遍历目录树: 1. 定义目录树 $T = (V, E)$,其中: - $V$ 是目录节点集合 - $E$ 是父子目录关系集合 2. 遍历顺序满足: $$ \forall v \in V, \text{children}(v) \text{ 在 } v \text{ 之前被处理} $$ 3. 删除条件: $$ \text{delete}(v) \iff \text{files}(v) = \emptyset \land \text{subdirs}(v) = \emptyset $$ ## 高级功能扩展 如果需要更强大的功能,可以考虑以下增强: ```python # 添加日志记录功能 import logging logging.basicConfig(filename='folder_cleanup.log', level=logging.INFO) # 添加递归深度限制 def delete_empty_subfolders(root_dir, max_depth=10): # 实现略... # 添加排除特定文件夹的功能 exclude_folders = ['.git', 'node_modules'] if os.path.basename(current_dir) in exclude_folders: continue ``` ## 注意事项 1. **权限问题**:确保程序有权限删除目标文件夹 2. **只读文件**:如果文件夹中有只读文件,删除可能会失败 3. **符号链接**:脚本不会跟随符号链接到其他位置 4. **删除不可逆**:操作前请确认目标目录正确 5. **系统文件夹**:避免操作系统关键目录(如Windows系统目录) ## 相关问题 1. 如何批量删除特定类型的文件? 2. 如何查找并删除重复文件? 3. 如何按文件修改时间整理文件夹? 4. 如何统计文件夹中各类文件的数量和大小? > 文件操作前请务必备份重要数据。此脚本仅删除完全空的文件夹,不会删除包含文件文件夹[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值