c# - قم بتنزيل الملفات من SFTP مع مكتبة SSH.NET




(3)

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);
        }
    }
}

Renci.SshNet مكتبة SSH.NET ( Renci.SshNet ) للعمل مع خادم SFTP. ما أحتاج إلى القيام به هو انتزاع الملفات من مجلد معين على خادم SFTP استنادًا إلى تاريخ اليوم. ثم انسخ تلك الملفات من خادم SFTP إلى محرك محلي على خادم خاص بي.

أعلاه هو رمز لدي لكنه لا يعمل. في بعض الأحيان ، تقول أن الملف غير موجود ولكن في بعض الأحيان ، لن يتم تنزيل الملفات التي سأقوم بتنزيلها على خوادمنا المحلية ، لكنني بحاجة إلى تنزيل أي ملفات تم تحميلها إلى المجلد البعيد لهذا اليوم.

هل يستطيع أحدهم إلقاء نظرة ومعرفة ما هو الخطأ؟ أعتقد أن لها علاقة بجزء التدفق. لقد عملت مع FTP كثيرًا إلى جانب تحميل الملفات التي أخذت بعض الشفرات السابقة التي كنت أفكر فيها وأستطيع عكس العملية ولكن ذلك لا يعمل. يستند التعليمة البرمجية المستخدمة من هذا example .


بدون تقديم أي رسالة خطأ محددة ، من الصعب تقديم اقتراحات محددة.

ومع ذلك ، كنت تستخدم نفس المثال وكان الحصول على استثناء أذونات على File.OpenWrite - باستخدام متغير localFileName ، لأن استخدام Path.GetFile كان يشير إلى موقع من الواضح أنه لن يكون لديه أذونات لفتح الملف> C: \ ProgramFiles \ (اكسبرس) \ filename.doc IIS

لقد وجدت أن استخدام System.IO.Path.GetFileName غير صحيح ، استخدم System.IO.Path.GetFullPath بدلاً من ذلك ، أشر إلى الملف الذي يبدأ بـ "C: \ ..."

فتح الحل الخاص بك في FileExplorer ومنح أذونات asp.net للملف أو أي مجلدات عقد الملف. تمكنت من تنزيل ملفي عند هذه النقطة.


رمز العمل البسيط لتنزيل ملف مع مكتبة SSH.NET هو:

using (Stream fileStream = File.Create(@"C:\target\local\path\file.zip"))
{
    sftp.DownloadFile("/source/remote/path/file.zip", fileStream);
}

للتوضيح ، لماذا لا يعمل الرمز الخاص بك:

المعلمة الثانية من SftpClient.DownloadFile عبارة عن دفق لكتابة محتويات تم تنزيلها.

أنت تمر في دفق قراءة بدلاً من دفق كتابة. وعلاوةً على ذلك ، فإن المسار الذي تقوم بفتحه بدفق القراءة هو مسار بعيد ، ما لا يعمل مع فئة File تعمل على الملفات المحلية فقط.

فقط تجاهل سطر File.OpenRead واستخدم نتيجة مكالمة File.OpenWrite السابقة بدلاً من ذلك (التي لا تستخدمها على الإطلاق الآن):

Stream file1 = File.OpenWrite(localFileName);

sftp.DownloadFile(file.FullName, file1);

أو حتى أفضل من ذلك ، استخدم File.Create لتجاهل أي محتويات سابقة قد يحتوي عليها الملف المحلي.

لست متأكداً إذا كان من المفترض localFileName الخاص بك للاحتفاظ المسار الكامل أو اسم الملف فقط. لذلك قد تحتاج إلى إضافة مسار أيضا ، إذا لزم الأمر (الجمع بين localFileName مع sDir ؟)


في حين يعمل المثال ، فإنه ليس الطريقة الصحيحة للتعامل مع التدفقات ...

تحتاج إلى ضمان إغلاق الملفات / تدفقات مع استخدام عبارة .. أيضا ، إضافة محاولة / الصيد للتعامل مع أخطاء 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);
                    }
            }

        }
    }




sftp