利用C程序中的索引节点结构在Linux中修改目录为文件

利用C程序中的索引节点结构在Linux中修改目录为文件,c,linux,filesystems,inode,file-structure,C,Linux,Filesystems,Inode,File Structure,我想把一个目录变成一个文件,我做了一些研究。在Linux中,inode结构存储关于文件和目录的元数据。我想将文件保护模式从目录更改为文件 Print some general file info #include <time.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> int main(int argc,

我想把一个目录变成一个文件,我做了一些研究。在Linux中,inode结构存储关于文件和目录的元数据。我想将文件保护模式从目录更改为文件

Print some general file info

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
 struct stat file_stats;

 if(argc != 2)
  fprintf(stderr, "Usage: fstat FILE...\n"), exit(EXIT_FAILURE);

 if((stat(argv[1], &file_stats)) == -1) {
  perror("fstat"); 
  return 1;
 }

 printf("filename: %s\n", argv[1]);
 printf(" device: %lld\n",                       file_stats.st_dev);
 printf(" inode: %ld\n",                         file_stats.st_ino);
 printf(" protection: %o\n",                     file_stats.st_mode);
 printf(" number of hard links: %d\n",           file_stats.st_nlink);
 printf(" user ID of owner: %d\n",               file_stats.st_uid);
 printf(" group ID of owner: %d\n",              file_stats.st_gid);
 printf(" device type (if inode device): %lld\n",file_stats.st_rdev);
 printf(" total size, in bytes: %ld\n",          file_stats.st_size);
 printf(" blocksize for filesystem I/O: %ld\n",  file_stats.st_blksize);
 printf(" number of blocks allocated: %ld\n",    file_stats.st_blocks);
 printf(" time of last access: %ld : %s",        file_stats.st_atime, ctime(&file_stats.st_atime));
 printf(" time of last modification: %ld : %s",  file_stats.st_mtime, ctime(&file_stats.st_mtime));
 printf(" time of last change: %ld : %s",        file_stats.st_ctime, ctime(&file_stats.st_ctime));

 return 0;
}
打印一些常规文件信息
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
结构统计文件_stats;
如果(argc!=2)
fprintf(stderr,“用法:fstat文件…\n”),退出(退出失败);
if((stat(argv[1],&file_stats))=-1){
佩罗尔(“fstat”);
返回1;
}
printf(“文件名:%s\n”,argv[1]);
printf(“设备:%lld\n”,文件\u stats.st\u dev);
printf(“inode:%ld\n”,文件\u stats.st\u ino);
printf(“保护:%o\n”,文件\u stats.st\u模式);
printf(“硬链接数:%d\n”,文件\u stats.st\u nlink);
printf(“所有者的用户ID:%d\n”,文件\u stats.st\u uid);
printf(“所有者的组ID:%d\n”,文件\u stats.st\u gid);
printf(“设备类型(如果是inode设备):%lld\n”,文件\u stats.st\u rdev);
printf(“总大小,字节:%ld\n”,文件\u stats.st\u size);
printf(“文件系统I/O的块大小:%ld\n”,文件\u stats.st\u blksize);
printf(“分配的块数:%ld\n”,文件\u stats.st\u blocks);
printf(“上次访问时间:%ld:%s”,文件\u stats.st\u atime,ctime(&file\u stats.st\u atime));
printf(“上次修改时间:%ld:%s”,文件\u stats.st\u mtime,ctime(&file\u stats.st\u mtime));
printf(“上次更改的时间:%ld:%s”,文件\u stats.st\u ctime,ctime(&file\u stats.st\u ctime));
返回0;
}

有没有办法将目录更改为文件??如何用C程序修改索引节点结构?

要打开任何文件,必须使用开放系统调用。但目前开放系统调用不允许任何人打开目录进行写入。如果使用目录调用open进行写入,它将返回错误(-1)并将errno设置为EISDIR


如果仍然要这样做,必须重新实现Linux文件系统驱动程序的开放系统调用。

要打开任何文件,必须使用开放系统调用。但目前开放系统调用不允许任何人打开目录进行写入。如果使用目录调用open进行写入,它将返回错误(-1)并将errno设置为EISDIR


尽管如此,您仍然需要重新实现Linux文件系统驱动程序的开放系统调用。

是否有特别的理由不只是删除文件然后创建目录?是的。我想把目录当作文件来处理,一个目录已经是一个文件了。你到底想做什么?在编程上,我不确定,但是有一个叫做debugfs的东西你可以检查。我刚刚读过,自己也没用过,但这里有一个讨论->。它通常用于检查和更改ext*文件系统类型的状态。是的,就像Duck说的,目录就是一个文件。那么,通过更改inode中的属性,您可以实现什么呢?@Nimit:您到底想对无法执行的目录执行什么操作?这个问题在最好的情况下是模糊的,在最坏的情况下是无法回答的。是否有特别的理由不只是删除文件然后创建目录?是的。我想把目录当作文件来处理,一个目录已经是一个文件了。你到底想做什么?在编程上,我不确定,但是有一个叫做debugfs的东西你可以检查。我刚刚读过,自己也没用过,但这里有一个讨论->。它通常用于检查和更改ext*文件系统类型的状态。是的,就像Duck说的,目录就是一个文件。那么,通过更改inode中的属性,您可以实现什么呢?@Nimit:您到底想对无法执行的目录执行什么操作?这个问题在最好的情况下是模糊的,在最坏的情况下是无法回答的。有没有办法将目录转换为文件?我认为没有这样的选择。但是你可以将内容复制到一个新文件中,并用新创建的文件替换现有目录。有没有办法将目录转换为文件?我认为没有这样的选择。但您可以将内容复制到新文件中,并用新创建的文件替换现有目录。