FTP Проверьте, существует ли файл при загрузке и переименовывает ли он его в C # - PullRequest
3 голосов
/ 15 марта 2011

У меня есть вопрос о загрузке на FTP с C #.

То, что я хочу сделать, - это если файл существует, тогда я хочу добавить, например, Копия или 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 ]

5 голосов
/ 15 марта 2011

Это не особенно элегантно, так как я просто бросил это вместе, но я думаю, это в значительной степени то, что вам нужно?

Вы просто хотите продолжать проверять свои запросы, пока не получите «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;
        }
    }

Редактировать: Обновлено, так что это будет работать для любого типа веб-запроса и немного тоньше.

2 голосов
/ 15 марта 2011

Поскольку протокол управления FTP медленный по своей природе (отправка-получение), я предлагаю сначала извлечь содержимое каталога и проверить его перед загрузкой файла. Обратите внимание, что dir может возвращать два разных стандарта: dos и unix

В качестве альтернативы вы можете использовать команду <a href="http://www.nsftools.com/tips/RawFTP.htm#MDTM" rel="nofollow">MDTM</a> file, чтобы проверить, существует ли файл (используется для получения метки времени файла).

0 голосов
/ 03 апреля 2014

Я работаю над чем-то похожим. Моя проблема была в том, что:

request.Method = WebRequestMethods.Ftp.GetFileSize;

на самом деле не работал. Иногда это давало исключение, иногда нет. И для того же файла! Понятия не имею почему.

Я изменил это, как сказал Тедд (спасибо, кстати) на

request.Method = WebRequestMethods.Ftp.GetDateTimestamp;

и, похоже, теперь работает.

0 голосов
/ 15 марта 2011

Нет ярлыка.Вам нужно dir целевой каталог, а затем использовать #, чтобы определить, какое имя вы хотите использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...