System.IO.File.Copy抛出IOException异常

问题描述:

我试图复制一些文件:System.IO.File.Copy抛出IOException异常

private void DoCopy() { 
    string[] files = Directory.GetFiles(Application.StartupPath + "\\App_Data", "*.*", SearchOption.AllDirectories); 

    string sFtpToReadFileFrom = "ftp://<user>:<pass>@mysite.tk/updates/App_Data/"; 
    string sPathToWriteFileTo = Application.StartupPath + "\\App_Data"; 

    WebClient webClient = new WebClient(); 
    webClient.Credentials = new NetworkCredential("user", "pass"); 

    foreach (string s in files) 
    { 
     string fileName = Path.GetFileName(s); 
     string destFile = Path.Combine(sPathToWriteFileTo, fileName); 
     byte[] fileData = webClient.DownloadData(sFtpToReadFileFrom + fileName); //shows correct bytes 

     File.Copy(s, destFile, true); 
    } 
} 

确切的错误是:该进程无法访问文件“C:\ AppLauncher \ AppLauncher \ BIN \调试\ App_Data \ firstFile',因为它正在被另一个进程使用。

我跟着“MSDN如何”在这里:http://msdn.microsoft.com/en-us/library/cc148994.aspx

如有任何直接的红旗,请不要让我知道。

+0

第一个文件应该是什么? – 2013-04-20 05:21:36

+0

当我点击属性时,它只是说文件 – avidprogrammer 2013-04-20 05:24:14

+0

我很难理解你的代码...请解释你正在尝试做什么。 – 2013-04-20 05:25:16

这就是我看待它:

您希望从FTP服务器上下载文件,并将其写入到本地磁盘。 你正在做的是将源目录中的文件作为目标,这根本不起作用。如果文件已经存在,那么他们可以在那里获取文件名。 (因此除外)

这里是你必须做的

连接到FTP,那里获取文件(其字节),然后在磁盘上创建文件。

private void DoCopy() { 
    //string[] files = Directory.GetFiles(Application.StartupPath + "\\App_Data", "*.*", SearchOption.AllDirectories); 

    //Acquire filenames from FTP-Server instead of local disk! 

    string sFtpToReadFileFrom = "ftp://<user>:<pass>@mysite.tk/updates/App_Data/"; 
    string sPathToWriteFileTo = Application.StartupPath + "\\App_Data"; 

    WebClient webClient = new WebClient(); 
    webClient.Credentials = new NetworkCredential("user", "pass"); 

    foreach (string s in files) 
    { 
     string fileName = Path.GetFileName(s); //create file names based on FTP-server 
     string destFile = Path.Combine(sPathToWriteFileTo, fileName); 
     byte[] fileData = webClient.DownloadData(sFtpToReadFileFrom + fileName); //shows correct bytes 

     //File.Copy(s, destFile, true); Rather use File.WriteAllBytes 
     File.WriteAllBytes(destFile, fileData); 
    } 
} 

用于File.WriteAllBytes一个例子见here

从FTP文件名的获取不是那么简单,虽然。 FtpWebRequest -class支持你。

+0

谢谢。我需要更新文件,它们都是相同的名称,但文件大小不同(已更新)。 – avidprogrammer 2013-04-20 05:38:20

+0

我刚下载它,它显示正确的字节,它为什么不复制? :( – avidprogrammer 2013-04-20 05:39:25

+0

你不能用'File.Copy'来更新它们,当目标存在时它会抛出一个System.IOException,或者在使用'File.Copy'之前删除文件或者我提供的方法。 – 2013-04-20 05:45:43