user-0 提问: c语言写一个目录下移除指定文件夹的程序

回复:
user: user-1
content: 如果按照赵四的说法，用 cmd 来删除，用标准 C 时间函数，就是这样：#include <stdio.h> #include <stdlib.h> #include <time.h>  int main (int argc, char *argv[]) { 	time_t rawtime = 0; 	struct tm *timeinfo = NULL; 	char buffer[1024] = { 0 };  	time (&rawtime); 	timeinfo = localtime (&rawtime); 	// 这里一次到位把命令包括路径格式化好直接执行 	strftime (buffer, sizeof(buffer), "cmd /c rd /s /q \"X:\\Path\\%Y%m%d\"", timeinfo); 	system(buffer);  	return 0; }如果全部自己实现，时间函数也采用 Windows 版本，那么我自己曾经写过递归删除目录的代码：#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib")  static BOOL IsDotOrDotDot(PCTSTR pszName) { 	if (*pszName++ == _T('.')) { 		switch (*pszName++) { 		case _T('\0'): 			return TRUE; 		case _T('.'): 			return !*pszName; 		} 	} 	return FALSE; }  static BOOL PASCAL InternalRemoveDirectoryRecursively(PCTSTR pszPath) { 	BOOL bResult = PathIsDirectory(pszPath); 	if (bResult) { 		TCHAR szWildcard[MAX_PATH] = { 0 }; 		if (PathCombine(szWildcard, pszPath, _T("*.*")) != NULL) { 			WIN32_FIND_DATA wfd = { 0 }; 			HANDLE hFind = FindFirstFile(szWildcard, &wfd); 			if (hFind != INVALID_HANDLE_VALUE) { 				TCHAR szFile[MAX_PATH] = { 0 }; 				do { 					if (!IsDotOrDotDot(wfd.cFileName)) { 						if (PathCombine(szFile, pszPath, wfd.cFileName) != NULL) { 							if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 								bResult = InternalRemoveDirectoryRecursively(szFile); 							} else { 								bResult = DeleteFile(szFile); 							} 						} 					} 				} while (FindNextFile(hFind, &wfd)); 				FindClose(hFind); 			} 		} 		if (bResult) { 			bResult = RemoveDirectory(pszPath); 		} 	} 	return bResult; }  BOOL PASCAL RemoveDirectoryRecursively(PCTSTR pszPath) { 	int nLength = lstrlen(pszPath); 	if ((nLength > 0) && (nLength < MAX_PATH)) { 		TCHAR szCanonical[MAX_PATH] = { 0 }; 		if (PathCanonicalize(szCanonical, pszPath)) { 			return InternalRemoveDirectoryRecursively(szCanonical); 		} 	} 	return FALSE; }  int main (int argc, char *argv[]) { 	SYSTEMTIME st = { 0 }; 	TCHAR szPath[MAX_PATH] = { 0 };  	GetLocalTime(&st); 	wsprintf(szPath, _T("X:\\Path\\%04u%02u%02u"), st.wYear, st.wMonth, st.wDay); 	BOOL bResult = RemoveDirectoryRecursively(szPath); 	printf("RemoveDirectoryRecursively: %d\n", bResult);  	return 0; }当然，我原本的实现比这个更复杂一些，还包括相对路径的判断、过滤路径中的无效字符、无法删除则标记为重启删除等等。主要是把核心的递归删除这部分提取出来了。

user: user-2
content: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE);  C:\>rd /? 删除一个目录。  RMDIR [/S] [/Q] [drive:]path RD [/S] [/Q] [drive:]path      /S      除目录本身外，还将删除指定目录下的所有子目录和             文件。用于删除目录树。      /Q      安静模式，带 /S 删除目录树时不要求确认

user: user-0
content: 是windows系统，我比较小白，可以简单给我讲下思路吗

user: user-3
content: 这个要看系统的API， 比如说linux, windows, windows你可以看msdn

user: user-2
content: 上帖第5行改为：sprintf(cmdstr,"cmd /c rd /s /q \“%s\”",adir);

user: user-2
content: 引用 5 楼 qq_37350941 的回复:赵老师，想再请教您一下： 删除文件夹现在掌握了，目前的问题是： 如何实现输入一个文件夹的名称，然后将其删除 char adir[256]; char cmdstr[1024]; fgets(adir,256,stdin); if ('\n'==adir[strlen(adir)-1]) adir[strlen(adir)-1]=0; sprintf(cmdstr,"cmd /c rd /s /q \'%s\'",adir); WinExec(cmdstr,SW_HIDE);

user: user-0
content: 赵老师，想再请教您一下： 删除文件夹现在掌握了，目前的问题是： 如何实现输入一个文件夹的名称，然后将其删除

user: user-4
content: 赵老师说的对， 直接用WinExec执行系统命令