我无法使用read()
,write()
和open()
将文件复制到新目录中。我能够使用open()
创建一个新文件,并且我能够使用write()
写入终端,但我假设我从int
传递了void *scanFile( s_request *request )
{
//TODO Print out all struct variables.
pthread_mutex_lock(&mutex);
int readFileReference;
int writeFileReference;
int bufferSize = request->bufferSize;
int numberOfBytesRead = bufferSize;
int *buffer[bufferSize];
if ((readFileReference = open(request->file, O_RDONLY)) == -1)
{
printf("Failed to open file. Aborting.\n");
exit(EXIT_FAILURE);
}
if ((writeFileReference = open("newfile.txt", O_CREAT | O_APPEND | O_RDWR) == -1))
{
printf("Failed to open write file. Aborting.\n");
exit(EXIT_FAILURE);
}
while ((read(readFileReference, buffer, numberOfBytesRead)) != 0)
{
write(writeFileReference, buffer, bufferSize);
bzero(buffer, bufferSize);
}
pthread_mutex_unlock(&mutex);
}
文件描述符打开写入,写入将写入指定的文件。
除此之外,一旦我打开文件,权限都很时髦,我只能以root身份打开它。每次我创建一个文件时,它都是空的,但我可以看到我刚读过的整个文件都在终端中打印出来。
我已经阅读了每个系统调用的man文件,但我仍然没有理解这里的问题。
这是我的代码:
void *scanFile( s_request *request )
{
//TODO Print out all struct variables.
pthread_mutex_lock(&mutex);
int readFileReference;
int writeFileReference;
int bufferSize = request->bufferSize;
int numberOfBytesRead = bufferSize;
int *buffer[bufferSize];
if ((readFileReference = open(request->file, O_RDONLY)) == -1)
{
printf("Failed to open file. Aborting.\n");
exit(EXIT_FAILURE);
}
if ((writeFileReference = open("newfile.txt", O_CREAT | O_WRONLY, 0777)) == -1)
{
printf("Failed to open write file. Aborting.\n");
exit(EXIT_FAILURE);
}
while ((read(readFileReference, buffer, numberOfBytesRead)) != 0)
{
write(writeFileReference, buffer, bufferSize);
bzero(buffer, bufferSize);
}
close(writeFileReference);
close(readFileReference);
pthread_mutex_unlock(&mutex);
}
修正了问题:
更新的代码:
{{1}}
答案 0 :(得分:3)
if ((writeFileReference = open("newfile.txt", O_CREAT | O_APPEND | O_RDWR) == -1))
你在这一行上的括号错了。 (在readFileReference
行上它是正确的。)你想要的是:
if ((writeFileReference = open("newfile.txt", O_CREAT | O_APPEND | O_RDWR)) == -1)
^^^ ^^^
该行的原始版本正在调用open()
,与-1
进行比较,然后将比较结果分配给writeFileReference
。
此外:
正如Zan Lynx在评论中所述,您需要在创建文件时将权限值传递给open()
。 0666
通常是正确的 - 它会将文件创建为可读/可写。 (它由进程umask修改,因此它最终会在典型配置下将文件创建为0644
。)
您需要在某处保存read
的返回值,并将其作为第三个参数传递给write
(而不是bufferSize
)。否则,您的程序将写入比读取更多的字节,例如复制小文件时。
从技术上讲,您应该检查write()
的返回值。就像read()
一样,每次调用时都不能保证完整写入。 (实际上,在处理常规文件时,它总是要么完成写入,要么返回错误,但是有些深奥的情况可能并非如此。)
写完后,您不需要bzero()
缓冲区。