[ad_1]
أهلاً. لدي Synology NAS لتخزين الملفات وأريد استخدام VB.net لأتمتة الأمور المتعلقة بتنزيل الملفات وتحميلها من وإلى خادم NAS. أتمنى أن يوجهني أي شخص إلى مورد ذي صلة لأنني كنت أحاول جاهداً إيجاد حل لهذه المشكلة ولكن يبدو أن الحظ لم يحالفني. نتطلع إلى مساعدتكم.
ما حاولت:
حاولت استخدام WebClient في .NET ولكن لم تتمكن من العثور على حل للقيام بذلك بشكل صحيح حيث يبدو أنه يتعامل فقط مع الدليل الفعلي على خادم الملفات الحالي الخاص بي ولكن ليس على خادم NAS.
الحل 1
هل حاولت تعيين مجلدات NAS على محرك أقراص افتراضي في Windows؟ ويظهر بعد ذلك كحرف محرك أقراص “عادي” لجميع التطبيقات ويمكن الوصول إليه على هذا النحو.
أفعل ذلك، ولكن نظرًا لأن وحدات NAS الخاصة بي هي SMB1، فقد يكون Windows صعبًا بشأن إعادة توصيلها، لذلك كتبت تطبيقًا لإعادة إجراء الاتصالات. (وحتى مع ذلك، يجب أن أقوم بإعادة تشغيل Windows في بعض الأحيان قبل أن يعمل – Windows حقًا لا يريدك أن تستخدم SMB1 بعد الآن.)
الرمز هو C#، ولكنه واضح جدًا – فهو يستخدم تطبيق Windows cmd “net use” لإزالة الاتصال وإعادة إنشائه لأن هذه كانت الطريقة الأكثر موثوقية التي وجدتها (فشلت مكالمات WIN32 التي كانت تعمل سابقًا في Win10 وWin11 عندما تم استهلاك دعم SMB1 ):
/// <summary> /// Tries to establish a connection to a network drive /// </summary> /// <param name="drive"></param> /// <param name="path"></param> private static void Connect(string drive, string path) { for (int attempts = 3; attempts > 0; attempts--) { if (attempts != 3) Thread.Sleep(5000); Process process = new Process(); process.StartInfo.RedirectStandardOutput = true; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.FileName = "net"; process.StartInfo.Arguments = $"use {drive} /delete"; process.Start(); process.WaitForExit(); process = new Process(); process.StartInfo.RedirectStandardOutput = true; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.FileName = "net"; process.StartInfo.Arguments = $"use {drive} {path}"; process.Start(); process.WaitForExit(); DriveInfo di = new DriveInfo(drive.Substring(0, 1)); if (di.IsReady) return; } Storage.WriteLog($"Unable to connect {drive} to \"{path}\" after three attempts"); }
[ad_2]
コメント