PDA

View Full Version : Folder Access Denied هنگام حذف دایرکتوری



پرستو پارسایی
یک شنبه 19 اردیبهشت 1400, 15:41 عصر
با سلام من در شاخه ویندوز در درایو سی یک دایرکتوری ایجاد و در آن یک فایل رو اکسترکت میکنم ولی تلاشم برای حذف دایرکتوری ایجاد شده نتیجه نداد . از چندین روش متفاوت استفاده کردم ولی نتیجه مطلوب نگرفتم لازم به توضیح اینکه پروژه رو روی ادمین تنظیم کردم و حتی اگر ریست هم کنم مشکل حل نمیشه .این مورد برای ویندوز 7 به بالا مورد نیازم هست ممنون میشم اساتید در صورت اطلاع پاسخ دهید

Dim path As String = "C:\Windows"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Directory.GetDirectories(path, "New", SearchOption.AllDirectories).
ToList().ForEach(Sub(x) Directory.Delete(x, True))
End Sub

Or

Try Dim path As String = "C:\Windows"
Dim directory As New DirectoryInfo(path)
directory.Delete(True)
Catch


End Try

the king
یک شنبه 19 اردیبهشت 1400, 19:36 عصر
با سلام من در شاخه ویندوز در درایو سی یک دایرکتوری ایجاد و در آن یک فایل رو اکسترکت میکنم ولی تلاشم برای حذف دایرکتوری ایجاد شده نتیجه نداد . از چندین روش متفاوت استفاده کردم ولی نتیجه مطلوب نگرفتم لازم به توضیح اینکه پروژه رو روی ادمین تنظیم کردم و حتی اگر ریست هم کنم مشکل حل نمیشه .این مورد برای ویندوز 7 به بالا مورد نیازم هست ممنون میشم اساتید در صورت اطلاع پاسخ دهید

Dim path As String = "C:\Windows"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Directory.GetDirectories(path, "New", SearchOption.AllDirectories).
ToList().ForEach(Sub(x) Directory.Delete(x, True))
End Sub

Or

Try Dim path As String = "C:\Windows"
Dim directory As New DirectoryInfo(path)
directory.Delete(True)
Catch


End Try
از جهت دسترسی به پوشه ای که خود برنامه تون ساخته اساسا مشکلی نیست، چون خود کاربری که برنامه تون با حساب کاربری اش اجرا میشه، صاحب و Owner اون پوشه محسوب خواهد شد و برای حذف کردنش طبعا دسترسی کافی داره.
اما چند تا مورد مهم هست.

اول اینکه مهمه جستجوی پوشه ها رو از کدوم مسیر یا با چه SearchOption ای شروع کنید.
وقتی می نویسید هر چی فولدر New در C:\Windows و زیر پوشه ها اش هست پیدا کن، دارید پوشه هایی نظیر
C:\Windows\Help\New و C:\Windows\System32\New و C:\Windows\Prefetch\ReadyBoot\New و ... رو بدست می آورید.
نه اینکه این پوشه ها روی هر ویندوزی وجود داشنه باشند یا پوشه های سیستمی حساسی باشند، نه، اما اگر روی ویندوزی پیدا شدند، برنامه شما سازنده شون نبوده.
پوشه هایی که شما نساخته اید رو که قاعدتا نمی خواهید حذف کنید.

ثانیا سیستم ممکنه به برنامه شما اجازه نده که همه زیر پوشه های C:\Windows رو پیمایش کنید، خیلی طبیعیه که دسترسی بعضی پوشه ها این اجازه رو نداره.
پس بهتره جستجو رو تا حدی که امکانش هست به پوشه های خودتون محدود کرده باشید.
توجه داشته باشید که PathIO صرفا یک اسم مستعار من در آوردی برای System.IO.Path ئه که خودم در ابتدای کد تعریف می کنم.
چون شما هم فیلدی به نام path دارید و با هم قاطی خواهند شد، نام مستعار برای System.IO.Path تعریف کردم تا کامپایلر دچار ابهام نشه.


Imports System.IO
Imports PathIO = System.IO.Path

Public Class Form1
Dim path As String = "C:\Windows"

Private Sub Button1_Click (sender As Object, e As EventArgs) Handles Button1.Click
Dim newPath = PathIO.Combine (path, "New")
If Directory.Exists (newPath) Then
ListBox1.Items.AddRange (Directory.GetDirectories (newPath, "*", SearchOption.AllDirectories))
End If
End Sub

Private Sub Button2_Click (sender As Object, e As EventArgs) Handles Button2.Click
Dim newPath = PathIO.Combine (path, "New")
Directory.CreateDirectory (PathIO.Combine (newPath, "Folder1\Test"))
Directory.CreateDirectory (PathIO.Combine (newPath, "Folder2"))
File.WriteAllText (PathIO.Combine (newPath, "Folder1\test.txt"), "1234")
End Sub

Private Sub Button3_Click (sender As Object, e As EventArgs) Handles Button3.Click
Dim newPath = PathIO.Combine (path, "New")
If Directory.Exists (newPath) Then
Directory.Delete (newPath, True)
End If
End Sub
End Class


ثالثا اگر فایلی به هر دلیلی در پوشه یا زیر پوشه هایی که قصد پاک کردن شون رو دارید باز باشه، اون فایل و مسیر پوشه قابل حذف کردن نیست.
مثلا من تصویر image.jpg رو در پوشه New شما ذخیره می کنم و در pictureBox1 نمایش می دهم :

Private Sub Button4_Click (sender As Object, e As EventArgs) Handles Button4.Click
Dim newPath = PathIO.Combine (path, "New")
Dim imagePath = PathIO.Combine (newPath, "image.jpg")
Directory.CreateDirectory (newPath)
SystemIcons.Information.ToBitmap ().Save (imagePath, Imaging.ImageFormat.Jpeg)
PictureBox1.Image = Image.FromFile (imagePath)
End Sub


دیگه سیستم به من اجازه نمیده این فایل تصویری در حال نمایش یا پوشه New رو حذف کنم، خطای عدم دسترسی خواهد داد :

Private Sub Button5_Click (sender As Object, e As EventArgs) Handles Button5.Click
Dim newPath = PathIO.Combine (path, "New")
Dim imagePath = PathIO.Combine (newPath, "image.jpg")
File.Delete (imagePath)
Directory.Delete (newPath, True)
End Sub


مگر اینکه قبلش اون فایل تصویری رو ببندم تا فایل و پوشه اش از Lock سیستم فایل در بیاد و Unlock بشه :

Private Sub Button5_Click (sender As Object, e As EventArgs) Handles Button5.Click
Dim newPath = PathIO.Combine (path, "New")
Dim imagePath = PathIO.Combine (newPath, "image.jpg")
If PictureBox1.Image IsNot Nothing Then
PictureBox1.Image.Dispose ()
PictureBox1.Image = Nothing
End If
File.Delete (imagePath)
Directory.Delete (newPath, True)
End Sub

پس موقع حذف پوشه New به اینکه در اون مسیر و زیر شاخه هاش چه فایل هایی ممکنه باز مونده باشند توجه داشته باشید.
اگر کاری در اون پوشه انجام داده اید که منجر به باز شدن فایل یا فایل هایی شده (مثلا فایل pdf رو در PDF Reader باز کرده اید)، قبل از حذف شون باید به فکر راهی برای بستن فایل ها یا برنامه مرتبط باشید.

336699
دوشنبه 20 اردیبهشت 1400, 11:32 صبح
سلام

این کد شما اصلا به مرحله حذف فولدر نمیرسه

در همان قسمت جستجوی فولدر به مشکل عدم دسترسی میخوره و اصلا نمیتواند لیست فولدرهای مورد نظر شما را پیدا کند

شما بهتره در یک مسیر دیگر فایلهای مورد نظرتان را اکسترکت نمایید.