Сборка WinSCP .NET - Как установить права доступа к папке после создания каталога?

Я создаю веб-сайт и хочу, чтобы при регистрации пользователя создавался каталог на SFTP-сервере и помещался в этот каталог новый файл.

Я использую сборку WinSCP .NET и пишу на С#.

Я заметил, что вы можете устанавливать разрешения только в методе: Session.PutFiles, а не в методе: Session.CreateDirectory

Итак, после того, как я создаю каталог и помещаю в него файл, я не могу получить доступ к файлу, потому что у меня нет разрешений - я получаю доступ к файлу с полным URL-адресом

Как я могу получить доступ к файлу?

PS. Когда я изменяю права доступа к каталогу вручную, я могу получить доступ к файлу.


person ro-E    schedule 13.07.2014    source источник


Ответы (1)


Обратите внимание, что это ответ на ваш вопрос о том, как установить разрешения при создании каталога. Но основная причина вашей проблемы заключается в том, что разрешения по умолчанию, установленные вашим сервером, неверны. Сервер не должен использовать разрешения по умолчанию, чтобы вы не могли получить доступ к каталогу/файлу, который вы только что создали сами!

В настоящее время невозможно напрямую установить разрешения при создании каталога или изменить их впоследствии с помощью сборки WinSCP .NET.
См. https://winscp.net/tracker/1075

Вы можете взломать его следующим образом:

  • Создайте локальный пустой временный каталог
  • Загрузите его, используя Session.PutFiles, установив необходимые разрешения в TransferOptions.FilePermissions
string directoryName = "mydir";
string directoryPath = "/home/username/" + directoryName;
string tempPath = Path.Combine(Path.GetTempPath(), directoryName);

Directory.CreateDirectory(tempPath);

try
{
    TransferOptions options = new TransferOptions();
    options.FilePermissions = new FilePermissions { Octal = "755" };
    session.PutFiles(tempPath, directoryPath, false, options).Check();
}
finally
{
    Directory.Delete(tempPath);
}

Вы даже можете обойтись без создания пустого временного каталога. Просто выберите любой каталог, например. каталог папки профиля вашей учетной записи и используйте маску файла, чтобы включить только этот один каталог, предотвращая загрузку файлов в каталоге и подкаталогах. Также используйте явное имя нужного удаленного каталога в целевом пути, чтобы «переименовать» загруженный каталог в желаемое имя.

person Martin Prikryl    schedule 14.07.2014
comment
Упомянутая ошибка отслеживается здесь: winscp.net/tracker/show_bug.cgi?id=1188 - person Martin Prikryl; 14.07.2014
comment
Я не могу сделать это с вложенными каталогами - кажется, мне, вероятно, нужно повторить это для каждого потомка в пути? - person drzaus; 22.09.2014
comment
кроме того, согласно PutFiles должно ли directoryName заканчиваться косой чертой? - person drzaus; 22.09.2014
comment
@drzaus Нет. В этом случае имя файла не опускается. Это directoryName. На самом деле это избыточно, вы можете использовать directoryPath="/home/username/" (обратите внимание на косую черту) для того же эффекта. Это всего лишь подсказка, как добиться того, что описано в последнем абзаце. - person Martin Prikryl; 22.09.2014