Member 12899279 Ответов: 2

Ошибка при использовании # в имени файла в каталоге ftp C#


удаленный сервер вернул ошибку(550 файлов недоступны).
насколько мне известно, # может использоваться в именовании файлов, тогда почему я получаю ошибку для доступа к файлам и папкам, которые имеют # в своем имени?
получить ошибку здесь на getrequeststream();

Что я уже пробовал:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(string.Format("{0}/{1}", server, fileName)));
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential(userName, passowrd);
            Stream ftpStream = request.GetRequestStream();

Member 12899279

Запрос FtpWebRequest = (FtpWebRequest)WebRequest.Create(new Uri(string.Формат("{0}/{1}", сервер, имя файла)));
запрос.Method = WebRequestMethods.Ftp.UploadFile;
запрос.Учетные данные = новый NetworkCredential(имя пользователя, passowrd);
FtpStream трансляция = запрос.Метод getrequeststream();
FileStream fs = файл.OpenRead(полное имя);
byte[] buffer = новый байт[1024];
двойной итог = (двойной)fs.Длина;
int byteRead = 0;
двойное чтение = 0;
делать
{
если (!backgroundWorker1.CancellationPending)
{
byteRead = fs.Read(буфер, 0, 1024);
ftpStream.Запись(буфер, 0, byteRead);
read += (double)byteRead;
двойной процент = чтение / итого * 100;
backgroundWorker1.ReportProgress((int)процент);
}
}
while (byteRead != 0);
ПС.Рядом();
ftpStream.Закрывать();

Richard MacCutchan

Попробуйте сделать это без символа#.

Member 12899279

конечно, я попробовал его для файлов и папок без#, и это прекрасно работает, но это не то решение, у меня есть много папок и файлов, которые я хочу использовать и иметь # в их названии

Richard MacCutchan

Попробуйте использовать управляющий код # вместо хэш-символа. Хотя может быть какая - то другая причина, по которой сервер отклоняет его.

MadMyche

или %23

Richard MacCutchan

Конечно, я забыл о них.

Member 12899279

вы говорите, что я должен использовать % вместо #?Если нет, то любезно введите, что вы говорите, например, у меня есть папка с именем C# теперь, как я должен ввести ее, чтобы избежать этой ошибки?

Richard MacCutchan

Где я это сказал?

Richard Deeming

FtpWebRequest это действительно плохо разработанный API. Он смоделирован по версии HTTP, которая является протоколом без состояния, в то время как FTP-это протокол с отслеживанием состояния.

Я бы предложил вместо этого использовать правильную библиотеку FTP - например, FluentFTP[^].

2 Ответов

Рейтинг:
2

MadMyche

Наиболее вероятная причина заключается в том, что в то время как # может быть допустимым в имени файла, он используется в качестве разделителя в URL-адресе.
Ссылка: https://www.ietf.org/rfc/rfc1738.txt[^]

RFC 1738, опубликовано в декабре 1994 года
Небезопасный:
Персонажи могут быть небезопасны по ряду причин.

Символ пробела небезопасен, потому что значительные пробелы могут исчезнуть, а незначительные пробелы могут быть введены, когда URL-адреса транскрибируются или набираются на машинке или подвергаются обработке текстовыми программами.

Символы "<" и ">" небезопасны, поскольку они используются в качестве разделителей вокруг URL-адресов в свободном тексте; кавычки (""") используются для разграничения URL - адресов в некоторых системах.

Символ "#" небезопасен и всегда должен быть закодирован потому что он используется во Всемирной паутине и в других системах для разграничения URL-адреса от
идентификатор фрагмента/якоря, который может следовать за ним.

Символ "%" небезопасен, поскольку он используется для кодировки других символов.

Другие символы небезопасны, поскольку известно, что шлюзы и другие транспортные агенты иногда изменяют такие символы. Эти персонажи таковы "{", "}", "|", "\", "^", "~", "[", "]", и "`".


Member 12899279

есть ли какой-либо способ или что-то, что я должен изменить в приведенном выше коде, чтобы заставить его работать, потому что мне нужно использовать # in file и foldernames, чтобы я не мог устранить это
вы сказали о кодировании, как я должен кодировать его во время загрузки?

MadMyche

Вы бы использовали UrlEncode способ его кодирования.
Лично я бы изменил соглашения об именах, так как сохранение специального символа может быть проблематичным для FTP-клиентов.
Вы также можете сделать замену персонажа перед загрузкой, а затем "отменить замену" при загрузке.
В любом случае это повязка для некоторых "бизнес-требований", которые хотят сделать что-то, что не соответствует стандарту, которому уже 25 лет.

Member 12899279

замена символов потребует дополнительного кодирования.как использовать urlEncode для устранения этой проблемы?какие например?

MadMyche

Любая повязка, которую вы примените к этому, потребует кодирования и тестирования. Зайдите в google с помощью "C# UrlEncode", чтобы увидеть множество примеров

Рейтинг:
0

Member 12899279

string nn = comboBox1.Text.ToString();
           string name2;
           if (nn.Contains("#"))
           {
                name2= nn.Replace("#", "%23");
           }
           else
           {
               name2=nn;
           }


получил это как временное исправление.