غير مصرح به accessexception عند تشغيل تطبيق سطح المكتب من المجلد المشترك
-
01-10-2019 - |
سؤال
لقد قمت بإنشاء تطبيق سطح المكتب باستخدام VS 2008.
عندما أقوم بتشغيله محليًا ، يعمل كل شيء بشكل جيد.
شاركت مجلد الإخراج الخاص بي (دون السماح لمستخدمي الشبكة بتغيير ملفاتي) وقمت بتشغيل exe من كمبيوتر Vista آخر على إنترانت لدينا.
عند تشغيل EXE المشترك ، أتلقى "System.UnauthorizedAccessexception" عند محاولة قراءة ملف.
كيف يمكنني إعطاء الإذن للسماح بقراءة الملف؟ هل يجب علي تغيير الرمز؟ هل يجب علي منح إذن إلى المجلد Application على الكمبيوتر Vista؟ كيف؟
ملحوظات:
أنا لا أستخدم ClickOnce. يجب توزيع التطبيق باستخدام XCOPY.
إطار العمل المستهدف الخاص بي هو ".NET Framework 2.0"
على كمبيوتر Vista ، "ControlPanel | UninstallorChangePrograms" يقول إنه يحتوي على "Microsoft .NET Framework 3.5 SP1"
حاولت أيضًا تعيين محرك الأقراص المجلد ، لكنني حصلت على نفس الأخطاء ، والآن فقط اسم الملف هو "t: my.ocx"
' ----------------------------------------------------------------------
' رمز بلدي:
Dim SRC AS string = mcGlobals.cmcfiles.mcgetFilenameOcx ()
Dim ioStream كـ new System.io.filestream (SRC ، io.filemode.open)' ----------------------------------------------------------------------
وظيفة المشتركة العامة McGetFilenameOcx () كسلسلة
' ----------------------------------------------------------------------
Dim dirName As String = Application.StartupPath & "\" Dim sFiles() As String = System.IO.Directory.GetFiles(dirName, "*.ocx") Dim i As Integer For i = 0 To UBound(sFiles) Debug.WriteLine(System.IO.Path.GetFullPath(sFiles(i))) ' if found any - return the first: Return System.IO.Path.GetFullPath(sFiles(i)) Next Return "" End Function
' ----------------------------------------------------------------------
الاستثناء الذي أتلقاه:
System.UnauthorizedAccessException: Access to the path '\\computerName\sharedFolderName\my.ocx' is denied. at System.IO._Error(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(...) at System.IO.FileStream..ctor(...) at System.IO.FileStream..ctor(String path, FileMode mode)
' ----------------------------------------------------------------------
المحلول
وجدت ذلك.
وفقًا لـ MSDN ، [Filestream Constructor (String ، FileMode)
. . . بالنسبة للمنشدين دون معلمة fileAccess ،
- إذا تم ضبط معلمة الوضع على ألحق, يكتب هو الوصول الافتراضي.
- خلاف ذلك ، يتم تعيين الوصول إلى قراءة و كتابة.
-> استخدم الكود الخاص بي الافتراضي ، مع ioStream.canwrite: = صحيح ، وليس لدي يكتب إذن على المجلد المشترك.
لذلك أضفت fileAccess معامل:
new code:
Dim ioStream As New System.IO.FileStream(srcOcx, IO.FileMode.Open, IO.FileAccess.Read)
old code:
Dim ioStream As New System.IO.FileStream(srcOcx, IO.FileMode.Open)
نصائح أخرى
بدءا من .NET Framework 3.5 SP1 يُسمح لك بتشغيل تطبيق من مشاركة الشبكة. ليس عليك أن تستهدفها ، عليك فقط تثبيتها.