这是来自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 文件)有什么想法吗?谢谢!
有 3 种常见的故障模式:
- 源文件
C:test1.txt
不存在。 - 目标文件
C:Testtest1.txt
存在,但为只读。 - 目标目录
C:Test
不存在。
我的猜测是第 3 项是问题所在,如果是这样,您需要在调用File.Copy
之前确保目标目录存在。如果是这种情况,您将看到一个 DirectoryNotFoundException
.您可以使用Directory.CreateDirectory
来确保目标目录存在。
双反斜杠是表示字符串中反斜杠的正常方式。当您使用 @ 时,您是在说您不想解释任何转义序列(除其他外,请参阅此处以获取更多信息,在"文字"下)
所以问题是不同的。C:\test1.txt 和 C:\Test 是否存在?你有在 targetPath 中写入的权限吗?
尝试以下操作(根据需要添加异常处理和更多错误检查)
if (!Directory.Exists(targetPath)) {
Directory.CreateDirectory(targetPath);
}
if (File.Exists(sourceFile)) {
File.Copy(sourceFile,destFile,true);
}
反斜杠加倍是正确的,我认为您的问题是文件名。尝试在没有该操作的情况下读取文件,但在查看是否"隐藏已知类型的扩展"之前,如果您这样做,文件名应该是test1.txt.txt :)
如果您在遇到问题,请尝试查看此示例:
using System;
using System.IO;
class Test
{
public static void Main()
{
string path = @"c:tempMyTest.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
要确切地查看出了什么问题,您可以将代码包装在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:
)。尝试在该位置写入文件或创建目录可能会失败,因此我建议您使用其他位置。