c 使用 fstat 问题比较文件大小

Posted

技术标签:

【中文标题】c 使用 fstat 问题比较文件大小【英文标题】:c comparing file sizes using fstat issue 【发布时间】:2012-10-12 20:07:30 【问题描述】:

比较两个文件大小的代码似乎表现得好像keyfile > sourcefile。下面的代码中是否缺少某些内容,我可以更改什么?我用于测试的两个文件是 3kb 密钥文件和 14kb 源文件,它们应该会激活下面提供的最后一个 if 语句。

/* Get size of sourcefile. */
if((sourcefile = fopen(argv[1], "rb"))== NULL)

printf("Can't open source file.\n");
printf("Please enter a valid filename.\n");
printf("USAGE: OTP <source file> <output file> <keyfile>\n");
return (1);


fflush(sourcefile);
fstat(fileno(sourcefile), &statbuf);
fclose(sourcefile);

/* Get size of keyfile. */
if((keyfile = fopen(argv[3], "rb"))== NULL)

printf("Can't open keyfile.\n");
printf("Please enter a valid filename.\n"); 
printf("USAGE: OTP <source file> <output file> <keyfile>\n");
return(1);

fflush(keyfile);
fstat(fileno(keyfile), &keybuf);
fclose(keyfile);


/* Open necessary files. */
keyfile=fopen(argv[3], "rb");
sourcefile=fopen(argv[1], "rb");
destfile=fopen(argv[2], "wb");

/* Check if keyfile is the same size as, or bigger than the sourcefile */
if((keybuf.st_size) < (statbuf.st_size))

printf("Source file is larger than keyfile.\n");
printf("This significantly reduces cryptographic strength.\n");
printf("Do you wish to continue? (Y/N)\n");
scanf("%c", &ans);
if(ans == 'n' || ans == 'N')
    
    return (1);
    
if(ans == 'y' || ans == 'Y')
    
    printf("Proceeding with Encryption/Decryption.\n");
    
   

【问题讨论】:

您不需要打开文件两次... 啊,是的,你的意思是在/*打开必要的文件*/下?可以不用那里的密钥文件和源文件。编辑即将到来。 另外,您不检查是否可以打开destfile。如果无法写入指定的文件(权限错误等),这将失败。 @halex - OP 在问为什么它的行为相反(即他在问为什么它的行为就像 keyfile.size > statbuf.size)。 既然您实际上尝试自己实现它并想要验证,当然可以。请参阅我的更新答案。希望它没问题。 【参考方案1】:

这是因为如果无法打开密钥文件,您只能fstat。向上移动你的花括号。另外,作为表单的优化,不要打开文件,统计它,关闭它并重新打开它。只是不要关闭它并继续。

所以,既然你问了

/* Get size of sourcefile. */
if((sourcefile = fopen(argv[1], "rb"))== NULL)

printf("Can't open source file.\n");
printf("Please enter a valid filename.\n");
printf("USAGE: OTP <source file> <output file> <keyfile>\n");
return (1);


fflush(sourcefile);
//fstat(fileno(sourcefile), &statbuf);   // <-- this is not needed
//fclose(sourcefile);                    // <-- this is not needed

/* Get size of keyfile. */
if((keyfile = fopen(argv[3], "rb"))== NULL)

printf("Can't open keyfile.\n");
printf("Please enter a valid filename.\n"); 
printf("USAGE: OTP <source file> <output file> <keyfile>\n");
return(1);
                                         // <-- this brace is new (well, moved) (1)

fflush(keyfile);
//fstat(fileno(keyfile), &keybuf);    // <-- not needed
//fclose(keyfile);                    // <-- not needed
//                                     // <-- this brace has moved up 4 lines to (1)

/* Open necessary files. */
keyfile=fopen(argv[3], "rb");
sourcefile=fopen(argv[1], "rb");
destfile=fopen(argv[2], "wb");

/* Check if keyfile is the same size as, or bigger than the sourcefile */
if((keybuf.st_size) < (statbuf.st_size))

printf("Source file is larger than keyfile.\n");
printf("This significantly reduces cryptographic strength.\n");
printf("Do you wish to continue? (Y/N)\n");
scanf("%c", &ans);
if(ans == 'n' || ans == 'N')
    
    return (1);
    
if(ans == 'y' || ans == 'Y')
    
    printf("Proceeding with Encryption/Decryption.\n");
    
   

【讨论】:

另外,你不需要fflush它。你没有写任何东西。 互联网应该有更多像你这样的人哈哈。超级英雄(ish)=P

以上是关于c 使用 fstat 问题比较文件大小的主要内容,如果未能解决你的问题,请参考以下文章

fstat - 读取文件相关信息

C语言 stat()函数获得文件大小需不需要打开文件?就是stat()函数是怎么获得文件的大小的?

Stat(),Lstat(),Fstat() 获取文件/目录的相关信息

比较文件大小并移动到文件夹

C语言中字符串比较大小的规则!

PHP文件操作