C#的新手 - 无法让File.Copy工作

时间:2012-04-10 14:12:02

标签: c# string verbatim

这是来自Microsoft的代码示例,具有不同的文件位置,但不起作用:

 string fileName = "test1.txt";
 string sourcePath = @"C:\";
 string targetPath = @"C:\Test\";

 // Use Path class to manipulate file and directory paths.
 string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
 string destFile = System.IO.Path.Combine(targetPath, fileName);

 System.IO.File.Copy(sourceFile, destFile, true);

找不到源文件。如果我设置了一个断点,这就是我得到的:

    args    {string[0]} string[]
    fileName    "test1.txt" string
    sourcePath  "C:\\"  string
    targetPath  "C:\\Test\\"    string
    sourceFile  "C:\\test1.txt" string
    destFile    "C:\\Test\\test1.txt"   string

因此即使使用逐字字符串,它看起来也会加倍反斜杠。 (毫无疑问,我在C中有一个test1.txt文件:)有什么想法吗?谢谢!

5 个答案:

答案 0 :(得分:5)

有3种常见的故障模式:

  1. 源文件C:\test1.txt不存在。
  2. 目标文件C:\Test\test1.txt存在但只读。
  3. 目标目录C:\Test不存在。
  4. 我的猜测是第3项是问题,如果是这样,你需要确保在调用File.Copy之前目标目录存在。如果是这种情况,您将看到DirectoryNotFoundException。您可以使用Directory.CreateDirectory确保目标目录存在。

答案 1 :(得分:3)

双反斜杠是表示字符串中反斜杠的常用方法。当你使用@时,你说你不想解释任何转义序列(除其他外,请参阅here了解更多信息,在“文字”下)

所以问题不同了。 C:\ test1.txt和C:\ Test是否存在?你有权写入targetPath吗?

尝试以下操作(根据需要添加异常处理和更多错误检查)

if (!Directory.Exists(targetPath)) {
    Directory.CreateDirectory(targetPath);
}
if (File.Exists(sourceFile)) {
    File.Copy(sourceFile,destFile,true);
}

答案 2 :(得分:0)

如果您遇到问题,请尝试查看此示例:

using System;
using System.IO;
class Test 
{
    public static void Main() 
    {
        string path = @"c:\temp\MyTest.txt";
        string path2 = path + "temp";

        try 
        {
            // Create the file and clean up handles.
            using (FileStream fs = File.Create(path)) {}

            // Ensure that the target does not exist.
            File.Delete(path2);

            // Copy the file.
            File.Copy(path, path2);
            Console.WriteLine("{0} copied to {1}", path, path2);

            // Try to copy the same file again, which should succeed.
            File.Copy(path, path2, true);
            Console.WriteLine("The second Copy operation succeeded, which was expected.");
        } 

        catch 
        {
            Console.WriteLine("Double copy is not allowed, which was not expected.");
        }
    }
}

取自:http://msdn.microsoft.com/en-us/library/system.io.file.copy(v=vs.71).aspx

答案 3 :(得分:0)

反斜杠的加倍是正确的, 我认为你的问题是文件名。 尝试在没有该操作的情况下读取文件,但在查看是否“隐藏已知类型的扩展名”之前,如果你的文件名应该是test1.txt.txt:)

答案 4 :(得分:0)

要确切了解出现了什么问题,可以将代码包装在try-catch块中:

try { // Code that can throw an exception }
catch (Exception ex)
{
    // Show what went wrong
    // Use Console.Write() if you are using a console
    MessageBox.Show(ex.Message, "Error!");
}

最可能的问题是缺少源文件,目标文件夹不存在,或者您无权访问该位置。

在Windows 7上,我注意到您需要管理员权限才能直接写入安装操作系统的驱动器的根目录(通常为c:\)。 尝试编写文件或在该位置创建目录可能会失败,因此我建议您使用其他位置。