我必须使用unix环境做一个C程序。我已经购买了“在Unix环境中推进编程”一书,到目前为止已经帮了很多忙。但是,我的一些问题没有得到答复,我正在寻求一些帮助。
我正在尝试编写一个程序,可以验证是否存在复制程序时输入的第一个和第二个参数。如果第一个参数不存在,则必须出现错误消息并退出。如果第二个参数确实存在,则必须显示覆盖提示。我不确定如何验证文件是否已经存在或基本上没有。
我见过一些人说你可以做(!-e)或类似的东西来验证现有/不存在的文件。
如果有人能帮助我,我真的很感激。
答案 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);
}
}