【问题标题】:Trouble testing copy file function in C在 C 中测试复制文件功能时遇到问题
【发布时间】:2013-11-09 07:38:51
【问题描述】:

好的,这可能是一个简单的解决方案,但经过一番搜索和测试后,我仍然感到困惑.. :(

这是我编写的代码的 sn-p:

int main(int argc, char *argv[]){
  int test;
  test = copyTheFile("test.txt", "testdir");
 if(test == 1)
    printf("something went wrong");
 if(test == 0)
    printf("copydone");
 return 0;
}

int copyTheFile(char *sourcePath, char *destinationPath){
    FILE *fin = fopen(sourcePath, "r");
    FILE *fout = fopen(destinationPath, "w");
    if(fin != NULL && fout != NULL){
        char buffer[10000];//change to real size using stat()
        size_t read, write; 

        while((read = fread(buffer, 1, sizeof(buffer), fin)) > 0){
            write = fwrite(buffer, 1, read, fout);
            if(write != read)
                return 1;       
        }//end of while
    }// end of if
    else{
        printf("Something wrong getting the file\n");       
        return 0;}
    if(fin != NULL)
        fclose(fin);
    if(fout != NULL)
        fclose(fout);
return 0;
}

一些快速说明:我对 C、编程,尤其是文件 I/O 非常陌生。我查阅了 fopen、fread 和 fwrite 的手册页。在查看了一些示例代码后,我想出了这个。我试图只复制一个简单的文本文件,然后将其放在destinationPath 指定的目标文件夹中。

我要放置文本文件的文件夹叫tes​​tdir,我要复制的文件叫test.txt。

我尝试在 copyFile 函数中使用的参数是:

  • “test.txt”“testdir”
  • ".../Desktop/project/test.txt" ".../Desktop/project/testdir"
  • "/Desktop/project/test.txt" "/Desktop/project/testdir"

每次尝试我都会得到打印语句“获取文件有问题”。我在想这可能是因为“testdir”是一个文件夹而不是一个文件,但是我将如何复制到一个文件夹?

对不起,如果这是一个非常基本的问题,我只是遇到了麻烦,所以任何建议都会很棒!

此外,如果您想提供更多帮助,“copyTheFile”函数应该复制文件而不管格式如何。因此,如果它是 .jpg 或其他东西,它应该复制它。如果你们中的任何人发现它有问题,请告诉我。

这适用于 Linux 上的 ISO/POSIX/C89/C99。

【问题讨论】:

  • 如果您在 Linux 上,为什么在您的示例之一中指定 C:? Linux 没有 C 盘的概念。
  • 糟糕,对不起,我正在远程编码,我查看的路径错误。我会编辑它。
  • 如果您使用的是 Linux,则文件路径分隔符是错误的。我假设“test.txt”和“testdir”在您运行代码的当前目录中。你也应该使用:“test.txt”“testdir/test_copy.txt”
  • 等等...所以您在 Windows 上,但是您远程登录到 Linux...并且您认为您可以在 Linux 中打开您的 Windows 机器上的文件,只需指定它在 Windows 中显示的文件名?为什么你会认为这会起作用??
  • @RobinGreen 我正在处理的代码需要提交。我使用 Filezilla 传输文件,我使用的所有东西都在我的 linux 桌面上,我保证哈哈

标签: c io path copy


【解决方案1】:

一开始,您需要包含 stdio.h 以提供 FILE 和 I/O 函数声明:

#include <stdio.h>

除此之外,您的程序可以编译并为我正常工作。不幸的是,如果不使用stat() 来检测目标是否为目录,则无法复制到目录,如果是,则在打开文件之前附加文件名。

其他一些小建议:

  • 具有两个字节幂的缓冲区(例如 4096)可能更有效,因为它与文件系统和磁盘访问模式对齐

  • 通常,返回状态码的 C 函数使用 0 表示成功,使用其他值(例如 1)表示失败,因此交换返回值可能不会那么混乱

  • fopenfreadfwrite 等标准库函数失败时,最好使用perror(NULL);perror("error prefix"); 进行报告,可能类似于:

    $ ./a.out
    ...
    错误前缀:没有这样的文件或目录

【讨论】:

  • 感谢您的建议,我很感激!我一定会换东西的。另外我要特别感谢您告诉我有关 perror 的信息,我刚刚阅读了手册页,我认为它会有所帮助。
【解决方案2】:

如果您尝试在目录中写入新文件,则应提供要写入的文件的完整路径。在你的情况下

"C:...\Desktop\project\testdir\testfile"

【讨论】:

  • 不需要给出完整路径,C: 对 Linux 无效,如前所述。
  • @RobinGreen 啊,我明白了。谢谢你的评论。注意点。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2021-03-27
  • 2021-10-23
相关资源
最近更新 更多