permission - renci ssh c#
Descargar archivos de SFTP con la biblioteca SSH.NET (4)
Mi versión del Código de @Merak Marey. Estoy comprobando si ya existen archivos y diferentes directorios de descarga para .txt y otros archivos
static void DownloadAll()
{
string host = "xxx.xxx.xxx.xxx";
string username = "@@@";
string password = "123";string remoteDirectory = "/IN/";
string finalDir = "";
string localDirectory = @"C:/filesDN/";
string localDirectoryZip = @"C:/filesDN/ZIP/";
using (var sftp = new SftpClient(host, username, password))
{
Console.WriteLine("Connecting to " + host + " as " + username);
sftp.Connect();
Console.WriteLine("Connected!");
var files = sftp.ListDirectory(remoteDirectory);
foreach (var file in files)
{
string remoteFileName = file.Name;
if ((!file.Name.StartsWith(".")) && ((file.LastWriteTime.Date == DateTime.Today)))
{
if (!file.Name.Contains(".TXT"))
{
finalDir = localDirectoryZip;
}
else
{
finalDir = localDirectory;
}
if (File.Exists(finalDir + file.Name))
{
Console.WriteLine("File " + file.Name + " Exists");
}else{
Console.WriteLine("Downloading file: " + file.Name);
using (Stream file1 = File.OpenWrite(finalDir + remoteFileName))
{
sftp.DownloadFile(remoteDirectory + remoteFileName, file1);
}
}
}
}
Console.ReadLine();
}
string host = @"ftphost";
string username = "user";
string password = "********";
string localFileName = System.IO.Path.GetFileName(@"localfilename");
string remoteDirectory = "/export/";
using (var sftp = new SftpClient(host, username, password))
{
sftp.Connect();
var files = sftp.ListDirectory(remoteDirectory);
foreach (var file in files)
{
if (!file.Name.StartsWith("."))
{
string remoteFileName = file.Name;
if (file.LastWriteTime.Date == DateTime.Today)
Console.WriteLine(file.FullName);
File.OpenWrite(localFileName);
string sDir = @"localpath";
Stream file1 = File.OpenRead(remoteDirectory + file.Name);
sftp.DownloadFile(remoteDirectory, file1);
}
}
}
Estoy usando la biblioteca SSH.NET ( Renci.SshNet
) para trabajar con un servidor SFTP. Lo que tengo que hacer es tomar los archivos de una carpeta específica en el servidor SFTP en función de la fecha de hoy. Luego copie esos archivos del servidor SFTP a un disco local en un servidor mío.
Arriba está el código que tengo pero no está funcionando. A veces dice que el archivo no existe, pero a veces los archivos que voy a descargar no estarán en mis servidores locales, pero necesito descargar los archivos que fueron cargados en la carpeta remota para ese día.
¿Alguien puede echar un vistazo y ver qué pasa? Creo que tiene algo que ver con la porción de transmisión. He trabajado mucho más con FTP que cargando archivos, tomé código anterior y pensé que podía revertir el proceso, pero eso no funciona. El código que utilicé está basado en este example .
Mientras el ejemplo funciona, no es la forma correcta de manejar las transmisiones ...
Debe asegurarse de cerrar los archivos / secuencias con la cláusula using . Además, agregue try / catch para manejar errores IO ...
public void DownloadAll()
{
string host = @"sftp.domain.com";
string username = "myusername";
string password = "mypassword";
string remoteDirectory = "/RemotePath/";
string localDirectory = @"C:/LocalDriveFolder/Downloaded/";
using (var sftp = new SftpClient(host, username, password))
{
sftp.Connect();
var files = sftp.ListDirectory(remoteDirectory);
foreach (var file in files)
{
string remoteFileName = file.Name;
if ((!file.Name.StartsWith(".")) && ((file.LastWriteTime.Date == DateTime.Today))
using (Stream file1 = File.OpenWrite(localDirectory + remoteFileName))
{
sftp.DownloadFile(remoteDirectory + remoteFileName, file1);
}
}
}
}
Sin que usted proporcione ningún mensaje de error específico, es difícil dar sugerencias específicas.
Sin embargo, estaba usando el mismo ejemplo y obtenía una excepción de permisos en File.OpenWrite - usando la variable localFileName, porque usar Path.GetFile apuntaba a una ubicación que obviamente no tendría permisos para abrir un archivo> C: / ProgramFiles / IIS (Express) / filename.doc
Descubrí que usar System.IO.Path.GetFileName no es correcto, use System.IO.Path.GetFullPath en su lugar, apunte a su archivo que comienza con "C: / ..."
También abra su solución en FileExplorer y otorgue permisos a asp.net para el archivo o cualquier carpeta que contenga el archivo. Pude descargar mi archivo en ese momento.
Un código de trabajo simple para descargar un archivo con la biblioteca SSH.NET es:
using (Stream fileStream = File.Create(@"C:/target/local/path/file.zip"))
{
sftp.DownloadFile("/source/remote/path/file.zip", fileStream);
}
Para explicar, por qué tu código no funciona:
El segundo parámetro de SftpClient.DownloadFile
es una secuencia para escribir los contenidos descargados.
Está pasando una secuencia de lectura en lugar de una secuencia de escritura. Y, además, la ruta de acceso que está abriendo leer secuencia es una ruta remota, lo que no puede funcionar con la clase File
opera solo en archivos locales.
Simplemente descarte la línea File.OpenRead
y use el resultado de la llamada File.OpenWrite
anterior (que no está usando ahora):
Stream file1 = File.OpenWrite(localFileName);
sftp.DownloadFile(file.FullName, file1);
O mejor aún, use File.Create
para descartar cualquier contenido anterior que pueda tener el archivo local.
No estoy seguro de si se supone que localFileName
contiene la ruta completa o solo el nombre del archivo. Entonces, si es necesario, también puede agregar una ruta (¿combinar localFileName
con sDir
?)