在 c 中显示文件夹内容 - 运行 时间错误
Displaying folder contents in c - Run time error
我正在尝试显示包含哪个文件夹作为输出。当我 运行 这个程序在我的硬盘上 1-2 分钟后它崩溃了,除了崩溃部分它工作得很好。我不知道如何防止这种情况。谁能帮我 ?
#include <string.h>
#include <stdio.h>
#include <dirent.h>
void showingFiles(DIR *, char *);
int main(void) {
DIR *folder;
char path[350];
sprintf(path, ".");
folder = opendir(path);
showingFiles(folder, path);
closedir(folder);
printf("\n\nEnter a key to close this program ");
getch();
return 0;
}
void showingFiles(DIR *currentFolder, char *path){
struct dirent *nextFile;
DIR *subFolder;
char copyPath[350];
strcpy(copyPath, path);
while ((nextFile = readdir(currentFolder)) != NULL) {
sprintf(copyPath, "%s//%s", path, nextFile->d_name);
printf("%s\n", (*nextFile).d_name);
if ((strcmp(nextFile->d_name, "..")) &&
strcmp(nextFile->d_name ,".") &&
(subFolder = opendir(copyPath)) != NULL) {
deletingFiles(subFolder, copyPath);
}
}
closedir(currentFolder);
}
您的代码中至少有 3 个问题可以解释崩溃:
- 用于存储完整路径名的缓冲区太短,您使用不安全的
sprintf
来构造它们,可能会导致缓冲区溢出。
- 您永远不会关闭在递归函数
showingFiles
中打开的 subFolder
目录句柄,可能 运行 超出系统句柄。
- 您确实在函数
showingFiles()
中关闭了目录句柄 currentFolder
,但它也在 main()
函数中关闭了。这会导致未定义的行为。根据经验,始终关闭打开它的函数中的句柄,并且只关闭那里。
不太重要但有问题:
命名 showingFiles
执行递归删除完整目录树的函数有点误导。
用双斜杠 //
分隔目录和路径名是无用且不可移植的。您可能一直在考虑 \
并将此 Windows 特定目录分隔符转换为 //
以实现 Unix 可移植性,但请注意单个正斜杠 是 Windows 文件系统处理程序支持,你应该始终使用 /
作为针对 Unix 和 Windows.
的程序的目录分隔符
这是修改后的版本:
#include <dirent.h>
#include <stdio.h>
#include <string.h>
void deleteTree(DIR *, const char *);
int main(void) {
char path[350] = ".";
DIR *folder = opendir(path);
if (folder != NULL) {
deleteTree(folder, path);
closedir(folder);
}
printf("\n\nEnter a key to close this program ");
getch();
return 0;
}
void deleteTree(DIR *currentFolder, const char *path) {
char copyPath[1024];
struct dirent *nextFile;
DIR *subFolder;
while ((nextFile = readdir(currentFolder)) != NULL) {
snprintf(copyPath, sizeof(copyPath), "%s/%s", path, nextFile->d_name);
printf("%s\n", nextFile->d_name);
if (strcmp(nextFile->d_name,"..")
&& strcmp(nextFile->d_name,".")
&& (subFolder = opendir(copyPath)) != NULL) {
deletingFiles(subFolder, copyPath);
closedir(subFolder);
}
}
}
我正在尝试显示包含哪个文件夹作为输出。当我 运行 这个程序在我的硬盘上 1-2 分钟后它崩溃了,除了崩溃部分它工作得很好。我不知道如何防止这种情况。谁能帮我 ?
#include <string.h>
#include <stdio.h>
#include <dirent.h>
void showingFiles(DIR *, char *);
int main(void) {
DIR *folder;
char path[350];
sprintf(path, ".");
folder = opendir(path);
showingFiles(folder, path);
closedir(folder);
printf("\n\nEnter a key to close this program ");
getch();
return 0;
}
void showingFiles(DIR *currentFolder, char *path){
struct dirent *nextFile;
DIR *subFolder;
char copyPath[350];
strcpy(copyPath, path);
while ((nextFile = readdir(currentFolder)) != NULL) {
sprintf(copyPath, "%s//%s", path, nextFile->d_name);
printf("%s\n", (*nextFile).d_name);
if ((strcmp(nextFile->d_name, "..")) &&
strcmp(nextFile->d_name ,".") &&
(subFolder = opendir(copyPath)) != NULL) {
deletingFiles(subFolder, copyPath);
}
}
closedir(currentFolder);
}
您的代码中至少有 3 个问题可以解释崩溃:
- 用于存储完整路径名的缓冲区太短,您使用不安全的
sprintf
来构造它们,可能会导致缓冲区溢出。 - 您永远不会关闭在递归函数
showingFiles
中打开的subFolder
目录句柄,可能 运行 超出系统句柄。 - 您确实在函数
showingFiles()
中关闭了目录句柄currentFolder
,但它也在main()
函数中关闭了。这会导致未定义的行为。根据经验,始终关闭打开它的函数中的句柄,并且只关闭那里。
不太重要但有问题:
命名
showingFiles
执行递归删除完整目录树的函数有点误导。用双斜杠
//
分隔目录和路径名是无用且不可移植的。您可能一直在考虑\
并将此 Windows 特定目录分隔符转换为//
以实现 Unix 可移植性,但请注意单个正斜杠 是 Windows 文件系统处理程序支持,你应该始终使用/
作为针对 Unix 和 Windows. 的程序的目录分隔符
这是修改后的版本:
#include <dirent.h>
#include <stdio.h>
#include <string.h>
void deleteTree(DIR *, const char *);
int main(void) {
char path[350] = ".";
DIR *folder = opendir(path);
if (folder != NULL) {
deleteTree(folder, path);
closedir(folder);
}
printf("\n\nEnter a key to close this program ");
getch();
return 0;
}
void deleteTree(DIR *currentFolder, const char *path) {
char copyPath[1024];
struct dirent *nextFile;
DIR *subFolder;
while ((nextFile = readdir(currentFolder)) != NULL) {
snprintf(copyPath, sizeof(copyPath), "%s/%s", path, nextFile->d_name);
printf("%s\n", nextFile->d_name);
if (strcmp(nextFile->d_name,"..")
&& strcmp(nextFile->d_name,".")
&& (subFolder = opendir(copyPath)) != NULL) {
deletingFiles(subFolder, copyPath);
closedir(subFolder);
}
}
}