C# FTP с отключенным CD

Вы можете использовать RegExp положительное выражение lookbehind или простую функцию, возвращающую желаемый результат - который на самом деле более настраиваемый.

var list = [
  'If you want these foams Ima give you the chrome @WillThaRapper.',
  'Whatever the mind of man can conceive and believe, it can achieve @NapoleonHill.',
  'Here is @my_id and please give me @yours.'
];

function replaceAts() {
  var replacer = function(match) {
    var id = match.substr(1);

    return `<a href="https://twitter.com/${id}" target="_blank">${id}</a>`;
  };

  for (var i = 0; i < list.length; i++) {
    list[i] = list[i].replace(/@\w+/g, replacer);
  }
}

replaceAts();

console.log(list);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

П.С. Дайте мне знать, если вам нужна версия решения для ES6, так как мы можем уменьшить их размер, значительно или, по крайней мере, улучшить читаемость.

6
задан RossFabricant 14 October 2008 в 15:05
поделиться

3 ответа

Я просто протестировал это на одном из наших dev серверов и действительно существует CWD, выпущенный FtpWebRequest.NET:

new connection from 172.16.3.210 on 172.16.3.210:21 (Explicit SSL)
hostname resolved : devpc
sending welcome message.
220 Gene6 FTP Server v3.10.0 (Build 2) ready...
USER testuser
testuser, 331 Password required for testuser.
testuser, PASS ****
testuser, logged in as "testuser".
testuser, 230 User testuser logged in.
testuser, OPTS utf8 on
testuser, 501 Please CLNT first.
testuser, PWD
testuser, 257 "/" is current directory.
testuser, CWD /
testuser, change directory '/' -> 'D:\testfolder' --> Access allowed.
testuser, 250 CWD command successful. "/" is current directory.
testuser, TYPE I
testuser, 200 Type set to I.
testuser, PORT 172,16,3,210,4,127
testuser, 200 Port command successful.
testuser, NLST
testuser, 150 Opening data connection for directory list.
testuser, 226 Transfer ok.
testuser, 421 Connection closed, timed out.
testuser, disconnected. (00d00:05:01)

Это было, даже не указывая '/' в uri при создании объекта FtpWebRequest.

Если Вы отлаживаете или просматриваете исходный код, класс под названием 'FtpControlStream' играет роль. Посмотрите стек вызовов:

System.dll!System.Net.FtpControlStream.BuildCommandsList(System.Net.WebRequest req) Line 555    C#
System.dll!System.Net.CommandStream.SubmitRequest(System.Net.WebRequest request = 
    {System.Net.FtpWebRequest}, bool async = false, bool readInitalResponseOnConnect = true) Line 143   C#
System.dll!System.Net.FtpWebRequest.TimedSubmitRequestHelper(bool async) Line 1122 + 0x13 bytes C#
System.dll!System.Net.FtpWebRequest.SubmitRequest(bool async = false) Line 1042 + 0xc bytes C#
System.dll!System.Net.FtpWebRequest.GetResponse() Line 649  C#

Существует метод под названием BuildCommandsList (), который вызывается. BuildCommandsList () создает список из команд для отправки к FTP-серверу. Этот метод имеет следующий отрывок кода:

if (m_PreviousServerPath != newServerPath) { 
    if (!m_IsRootPath
        && m_LoginState == FtpLoginState.LoggedIn
        && m_LoginDirectory != null)
    { 
        newServerPath = m_LoginDirectory+newServerPath;
    } 
    m_NewServerPath = newServerPath; 

    commandList.Add(new PipelineEntry(FormatFtpCommand("CWD", newServerPath), PipelineEntryFlags.UserCommand)); 
}

После первого соединения с сервером m_PreviousServerPath является всегда пустым, значение newServerPath "/" и вычисляется функцией под названием GetPathAndFileName () (вызвал несколько строк до этого блока кода). GetPathAndFileName () вычисляет newServerPath как "/", если никакой путь не предоставляется или если "/" явно прикрепляется на конце 'ftp://....' uri.

Таким образом, это, конечно, в конечном счете заставляет команду CWD быть добавленной к конвейеру команд потому что пустой указатель! = "/".

Вкратце, к сожалению, Вы не можете переопределить это поведение, потому что оно записывается в источнике.

11
ответ дан 9 December 2019 в 20:51
поделиться

Я думаю, что у нас была подобная проблема некоторое время назад, я не помню точные детали все же.

Чтобы препятствовать тому, чтобы .NET дал команду CD, посмотрите при установке каталога по умолчанию для пользователя, Вы - вход в систему в том, как установлен на каталог, Вы хотите работать в. Можно просто использовать клиент ftp командной строки для проверки этого.

0
ответ дан 9 December 2019 в 20:51
поделиться

Вот решение: пользуйтесь этой свободной, Клиентской Библиотекой FTP с открытым исходным кодом для C#, сделанного Dan по C-SharpCorner.com: http://www.c-sharpcorner.com/uploadfile/danglass/ftpclient12062005053849am/ftpclient.aspx

Вот некоторый пример кода для загрузки файла:

FtpClient ftp = new FtpClient(FtpServer,FtpUserName,FtpPassword);
ftp.Login();
ftp.Upload(@"C:\image.jpg");
ftp.Close(); 

Эта библиотека хорошо работает из поля, но может также легко быть расширена и изменена.

0
ответ дан 9 December 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: