检查文件是否存在(由命令行参数给出)

时间:2012-09-06 14:00:01

标签: c unix

我必须使用unix环境做一个C程序。我已经购买了“在Unix环境中推进编程”一书,到目前为止已经帮了很多忙。但是,我的一些问题没有得到答复,我正在寻求一些帮助。

我正在尝试编写一个程序,可以验证是否存在复制程序时输入的第一个和第二个参数。如果第一个参数不存在,则必须出现错误消息并退出。如果第二个参数确实存在,则必须显示覆盖提示。我不确定如何验证文件是否已经存在或基本上没有。

我见过一些人说你可以做(​​!-e)或类似的东西来验证现有/不存在的文件。

如果有人能帮助我,我真的很感激。

2 个答案:

答案 0 :(得分:9)

access() 函数旨在告诉您文件是否存在(或者是可读,可写还是可执行)。

#include <unistd.h>
int result;
const char *filename = "/tmp/myfile";
result = access (filename, F_OK); // F_OK tests existence also (R_OK,W_OK,X_OK).
                                  //            for readable, writeable, executable
if ( result == 0 )
{
   printf("%s exists!!\n",filename);
}
else
{
   printf("ERROR: %s doesn't exist!\n",filename);
}

答案 1 :(得分:3)

int main(int argc, char** argv) {区块中。

if (argc == 3) {
   // then there were 3 arguments, the program name, and two parameters
} else if (argc == 2) {
   // then prompt for the "second" argument, as the program name and one
   // parameter exists
} else {
   // just print out the usage, as we have a non-handled number of arguments
}

现在,如果要验证文件是否存在,则与验证程序参数是否存在不同。基本上尝试打开文件并从中读取,但要密切注意捕获整数错误代码并检查它们是否有错误。这将阻止您的程序进入假定这些关键操作有效的位。

在处理C语言文件时,新程序员之间存在一种常见但错误的概念。基本上,人们确实希望确保特定的代码块能够工作(在你的情况下是复制块),所以他们检查,检查,并在执行块之前仔细检查条件。检查文件是否存在,检查它是否具有正确的权限,检查它是否不是目录等。我的建议是这样做。

您的复制块应该能够正常失败,就像它应该能够成功一样。如果失败,那么通常您拥有打印出有意义的错误消息所需的所有信息。如果您先检查然后执行,检查和操作之间总会有一个小的时间间隔,并且该时间间隔最终会在检查通过后删除或更改文件,但在此之前读。在这种情况下,所有预检代码都未能提供任何好处。

没有利益的代码只是未来错误和架构问题的嵌套基础。不要浪费时间编写具有可疑(或没有)益处的代码。当您怀疑某些代码已编写没有什么好处时,您需要重新构建代码以将其放在正确的位置。当您怀疑代码其他人已编写没有什么好处时,您需要首先怀疑您的怀疑。很容易看不到一段代码背后的动机,当刚刚开始使用一种新语言时更是如此。

祝你好运!

---厌倦的代码---

#include <errorno.h>
#include <stdio.h>
#include <stdlib.h>

extern int errno;

int main(int argc, char** argv) {

   // to hold our file descriptor
   FILE *fp;

   // reset any possible previously captured errors
   errno = 0;

   // open the file for reading
   fp = fopen(argv[1], "r");

   // check for an error condition
   if ( fp == 0 && errno != 0 ) {

     // print the error condition using the system error messages, with the
     // additional message "Error occurred while opening file"
     perror("Error occurred while opening file.\n");

     // terminate the program with a non-successful status
     exit(1);

   }

}