0

我正在尝试复制一些文件:

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\Debug\App_Data\firstFile',因为它正被另一个进程使用。

我在这里遵循了“MSDN How To”:http: //msdn.microsoft.com/en-us/library/cc148994.aspx

如果有人发现任何直接的危险信号,请告诉我。

4

1 回答 1

0

这就是我的看法:

您想从 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.

但是,从 FTP 获取文件名并不是那么简单。有FtpWebRequest-class来支持你。

于 2013-04-20T05:36:01.387 回答