gpt4 book ai didi

c S_ISDIR 和 S_ISREG 不工作

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:21 25 4
gpt4 key购买 nike

我需要使用 C 在 linux 中制作一个应用程序,我需要输入一个文件夹路径并将所有文件和子目录复制到一个新文件夹中。问题是当我尝试检查路径是文件夹还是文件时,程序总是采用文件夹的路径,即使它是文件。我不知道我做错了什么。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#include <assert.h>

int main()
{
CopyFile("test3","test4");
return (0);
}

void mkdirRecursive(const char *path, mode_t mode) {
char opath[PATH_MAX];
char *p;
size_t len;

strncpy(opath, path, sizeof(opath));
opath[sizeof(opath) - 1] = '\0';
len = strlen(opath);
if (len == 0)
return;
else if (opath[len - 1] == '/')
opath[len - 1] = '\0';
for(p = opath; *p; p++)
if (*p == '/') {
*p = '\0';
if (access(opath, F_OK))
mkdir(opath, mode);
*p = '/';
}
if (access(opath, F_OK))
mkdir(opath, mode);
}

void CopyFile(char* NumeFisOld, char* NumeFisNew)
{


DIR *dp;
struct dirent *dirp;
struct stat info;
char OldDirPath[255];
char NewDirPath[255];
stat(NumeFisOld,&info);
int status = stat (NumeFisOld, &info);
if (status != 0)
{
fprintf (stderr, "Error, errno = %d\n", errno);
perror("stat error: ");
return;
}
fprintf (stderr, "Error, errno = %d\n", errno);
perror("stat error: ");
if(S_ISREG(info.st_mode))
{
printf("File: File location: %s \n",NumeFisOld);
printf("File: New file location: %s \n",NumeFisNew);
char buffer[65];
int fhRead;
int fhWrite;
unsigned int nbytes=65;
int bytesread;
int byteswritten;
if((fhRead=open(NumeFisOld, O_RDONLY)) ==-1)
{
perror("Eroare la deschiderea fisierului");
exit(1);
}

if((bytesread=read(fhRead,buffer,nbytes))<=0)
perror("Probleme la citirea fisierului");
else
printf("Citeste %u bytes din fisier\n", bytesread);

close(fhRead);
if((fhWrite=open(NumeFisNew,O_WRONLY | O_CREAT,S_IREAD | S_IWRITE)) !=-1)
{
if((byteswritten=write(fhWrite, buffer, sizeof(buffer))) == -1)
perror("Eroare la scriere");
else
printf("A scris %u bytes in fisier\n",byteswritten);
close(fhWrite);
}

}
else if(S_ISDIR(info.st_mode))
{
printf("Folder: File location: %s \n",NumeFisOld);
printf("Folder: New file location: %s \n",NumeFisNew);
dp=opendir(NumeFisOld);
while((dirp=readdir(dp)) != NULL)
{

strcpy(OldDirPath, NumeFisOld);
strcat(OldDirPath,"/");
strcat(OldDirPath,dirp->d_name);
strcpy(NewDirPath, NumeFisNew);
strcat(NewDirPath, "/");
strcat(NewDirPath,dirp->d_name);
DIR* dir = opendir(NewDirPath);
if(dirp->d_name[0]!='.')
{
if (dir)
{
/* Directonry exists. */
CopyFile (OldDirPath,NewDirPath);
printf("Directorul %s exista deja \n",NewDirPath);
closedir(dir);
}
else if (ENOENT == errno)
{

printf("Directorul %s nu exista \n",NewDirPath);
mkdirRecursive(NewDirPath,0755);
CopyFile (OldDirPath,NewDirPath);
/* Directory does not exist. */
}
else
{
printf("Directorul %s nu s-a putut deschide \n",NewDirPath);
/* opendir() failed for some other reason. */
}
}

}


}

}

我的逻辑是:首先我检查路径是否是一个目录,如果是,在我的新文件夹(NumeFisNew)中创建它,然后输入它(NumeFisOld)并对其中的每个子目录或文件重复。如果路径是一个文件,那么它应该进入else并复制路径中的文件(NumeFisNew)。

编辑:好的,这是结果:

Error, errno = 0
stat error: : Success
Folder: File location: test3
Folder: New file location: test4
Error, errno = 0
stat error: : Success
Folder: File location: test3/test5
Folder: New file location: test4/test5
Directorul test4/test5 exista deja
Error, errno = 0
stat error: : Success
Folder: File location: test3/test4
Folder: New file location: test4/test4
Error, errno = 0
stat error: : Success
File: File location: test3/test4/test2
File: New file location: test4/test4/test2
Citeste 42 bytes din fisier
Directorul test4/test4/test2 exista deja
Directorul test4/test4 exista deja
Error, errno = 21
stat error: : Is a directory
File: File location: test3/test1
File: New file location: test4/test1
Citeste 42 bytes din fisier
Directorul test4/test1 exista deja

如果前面有File,表示从if(S_ISREG)使用,如果前面有Folder,表示从if(S_ISDIR)使用。所以至少现在它认识到 test1 和 test2 是文件,但它仍然将它们复制为文件夹。

最佳答案

你必须切换你的控制语句:先看它是不是一个文件,然后再检查它是不是一个目录

if (S_ISREG (info.st_mode)) 
{
printf ("It's a file\n");
}
else if (S_ISDIR (info.st_mode))
{
printf ("It's a dir\n");
}

此外,您应该注意统计返回值

int status = stat (NumeFisOld, &info);
if (status != 0)
{
fprintf (stderr, "Error, errno = %d\n", errno);
perror("stat error: ");
return;
}

关于c S_ISDIR 和 S_ISREG 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44239293/

25 4 0
文章推荐: java - 如何使用 Selenium 在框架/IFrame 和子框架上行走
文章推荐: jquery - 将多个 css 属性添加到简单模态
文章推荐: javascript - 仅更改 标签的属性,其中包含使用 jQuery 的 SVG 元素