怎样在CB中实现不打开文件,取得文件的大小?

「已注销」 2014-01-12 04:56:22
如题,主要想尽量少操作文件,谢谢
...全文
201 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
9527 2014-01-13
  • 打赏
  • 举报
回复

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

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

           if (argc != 2) {
               fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (stat(argv[1], &sb) == -1) {
               perror("stat");
               exit(EXIT_SUCCESS);
           }
           printf("File type:                ");

           switch (sb.st_mode & S_IFMT) {
           case S_IFBLK:  printf("block device\n");            break;
           case S_IFCHR:  printf("character device\n");        break;
           case S_IFDIR:  printf("directory\n");               break;
           case S_IFIFO:  printf("FIFO/pipe\n");               break;
           case S_IFLNK:  printf("symlink\n");                 break;
           case S_IFREG:  printf("regular file\n");            break;
           case S_IFSOCK: printf("socket\n");                  break;
           default:       printf("unknown?\n");                break;
           }

           printf("I-node number:            %ld\n", (long) sb.st_ino);

           printf("Mode:                     %lo (octal)\n",
                   (unsigned long) sb.st_mode);

           printf("Link count:               %ld\n", (long) sb.st_nlink);
           printf("Ownership:                UID=%ld   GID=%ld\n",
                   (long) sb.st_uid, (long) sb.st_gid);

           printf("Preferred I/O block size: %ld bytes\n",
                  (long) sb.st_blksize);
           printf("File size:                %lld bytes\n",
                   (long long) sb.st_size);
           printf("Blocks allocated:         %lld\n",
                   (long long) sb.st_blocks);

           printf("Last status change:       %s", ctime(&sb.st_ctime));
           printf("Last file access:         %s", ctime(&sb.st_atime));
           printf("Last file modification:   %s", ctime(&sb.st_mtime));

           exit(EXIT_SUCCESS);
       }

sololie 2014-01-12
  • 打赏
  • 举报
回复
比如你要获取一个目录中的文件信息,可以在程序启动时一次性收集这目录中的所有文件的信息存储在一个内存结构中,在需要获取文件信息时再索引这些文件信息而不再读取磁盘文件。不过内存操作也属于IO,只不过速度更快而已。
fxworld 2014-01-12
  • 打赏
  • 举报
回复
楼上好快喔。
fxworld 2014-01-12
  • 打赏
  • 举报
回复
HANDLE FindFirstFile( LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData ); 在 WIN32_FIND_DATA中取文件大小,不过你说的不打开文件应该做不到。
sololie 2014-01-12
  • 打赏
  • 举报
回复
不过 FindFirstFile 内部实现有没有调用openfile就不知道了 对操作系统不熟悉,不过我想系统应该无法要维护所有文件的这个海量的信息,无论如何都通过IO来读取文件信息的,这里你说的所谓“打开”文件就是IO操作,应该不能避免。 你可以指定一个不太大范围,把所有需要维护的文件的信息都收集缓存起来
sololie 2014-01-12
  • 打赏
  • 举报
回复
API FindFirstFile

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧