FTP上传时检查文件是否存在,是否在C#中重命名

时间:2011-03-15 15:05:49

标签: c# .net ftp

我有一个关于使用C#上传到FTP的问题。

我想要做的是,如果文件存在,那么我想在文件名之后添加像Copy或1,这样它就不会替换文件。任何想法?

var request = (FtpWebRequest)WebRequest.Create(""+destination+file);
request.Credentials = new NetworkCredential("", "");
request.Method = WebRequestMethods.Ftp.GetFileSize;

try
{
    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
    FtpWebResponse response = (FtpWebResponse)ex.Response;
    if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
    {

    }
}

4 个答案:

答案 0 :(得分:5)

我把它扔在一起并不是特别优雅,但我想这几乎是你需要的?

你只是想继续尝试你的请求,直到你得到一个“ActionNotTakenFileUnavailable”,所以你知道你的文件名是好的,然后只需上传它。

        string destination = "ftp://something.com/";
        string file = "test.jpg";
        string extention = Path.GetExtension(file);
        string fileName = file.Remove(file.Length - extention.Length);
        string fileNameCopy = fileName;
        int attempt = 1;

        while (!CheckFileExists(GetRequest(destination + "//" + fileNameCopy + extention)))
        {
            fileNameCopy = fileName + " (" + attempt.ToString() + ")";
            attempt++;
        }

        // do your upload, we've got a name that's OK
    }

    private static FtpWebRequest GetRequest(string uriString)
    {
        var request = (FtpWebRequest)WebRequest.Create(uriString);
        request.Credentials = new NetworkCredential("", "");
        request.Method = WebRequestMethods.Ftp.GetFileSize;

        return request;
    }

    private static bool checkFileExists(WebRequest request)
    {
        try
        {
            request.GetResponse();
            return true;
        }
        catch
        {
            return false;
        }
    }

编辑:已更新,因此这适用于任何类型的网络请求,并且稍微有些苗条。

答案 1 :(得分:2)

由于FTP控制协议本质上很慢(发送 - 接收),我建议先上传目录内容并在上传文件之前检查它。请注意,dir可以返回两个不同的标准:dos和unix

或者,您可以使用MDTM file命令检查文件是否已存在(用于检索文件的时间戳)。

答案 2 :(得分:0)

没有捷径。您需要dir目标目录,然后使用#来确定您要使用的名称。

答案 3 :(得分:0)

我正在做类似的事情。我的问题是:

request.Method = WebRequestMethods.Ftp.GetFileSize;

没有真正起作用。有时候它会有例外但它没有。而对于同一个文件!不知道为什么。

我改变它,因为Tedd说(谢谢,顺便说一下)

request.Method = WebRequestMethods.Ftp.GetDateTimestamp;

现在似乎有用了。