PDA

View Full Version : جستجو فایل در درایوها



Sub Zero
چهارشنبه 04 بهمن 1385, 20:16 عصر
سلام .
یه نگاه به کد زیر بندازید این کد تمام فایلهای یک درایو رو (با مشخص نمودن یک نوع ) پیدا می کنه اما یه مشکلی داره

Dim files As ReadOnlyCollection(Of String)
files = My.Computer.FileSystem.GetFiles("c:\", FileIO.SearchOption.SearchAllSubDirectories, "*.pdf")

مشکلش اینه که حتی فولدر C:\System Volume Information رو هم میخواد بگرده اما برنامه اجازه دسترسی به این فولدر رو نداره و
پیغام زیر رو نشون می ده :

Access to the path 'c:\System Volume Information' is denied
از این دستورات هم استفاده کردم اما فایده نداشت


Dim fperm As New FileIOPermission(PermissionState.Unrestricted, "c:\")
fperm.AllLocalFiles = FileIOPermissionAccess.AllAccess
راههای دیگه ای هم برای جستجو توی درایوها هست اما فکر نکنم از این ساده تر باشن حتما یه راهی برای رفع این مشکل وجود داره

Sub Zero
پنج شنبه 05 بهمن 1385, 15:51 عصر
نمی دونم از شانس ماست که هر چی میپرسیم کسی جواب نمیده :افسرده:
حداقل بگید کار با این دستورات چطوریه و به چه درد می خورن :

Dim fperm As New FileIOPermission(PermissionState.Unrestricted, "c:\")
fperm.AllLocalFiles = FileIOPermissionAccess.AllAccess

programmermp
پنج شنبه 05 بهمن 1385, 16:17 عصر
نمی دونم از شانس ماست که هر چی میپرسیم کسی جواب نمیده :افسرده:
حداقل بگید کار با این دستورات چطوریه و به چه درد می خورن :

Dim fperm As New FileIOPermission(PermissionState.Unrestricted, "c:\")
fperm.AllLocalFiles = FileIOPermissionAccess.AllAccess

سلام

ببین از این مثال چیزی دستگیریت می شه یا نه



Private Function AllFilesDemo() As Boolean Try Console.WriteLine("************************************************** ******" & ControlChars.Lf) Dim fileIOPerm1 As FileIOPermission Console.WriteLine("Creating a FileIOPermission and adding read access for all files") fileIOPerm1 = New FileIOPermission(FileIOPermissionAccess.AllAccess, "C:\Examples\Test\TestFile.txt") fileIOPerm1.AllFiles = FileIOPermissionAccess.Read Console.WriteLine("AllFiles access = " & fileIOPerm1.AllFiles.ToString()) Console.WriteLine("Adding AllAccess rights for local files.") fileIOPerm1.AllLocalFiles = FileIOPermissionAccess.AllAccess Console.WriteLine("AllLocalFiles access = " & fileIOPerm1.AllLocalFiles.ToString()) Catch e As ArgumentException Console.WriteLine(e.ToString()) Return False End Try Return TrueEnd Function 'AllFilesDemoبه خدا تقصیر من نیست نمی دونم چرا این ادیتوره هر چی توی تگ کدمی زارم این توری پشت سر هم می نویسه ببین اگه مشکل داری تو خوندنش که حتما داری کلمه کلیدی زیررو تو ام اس دی ان سرچ کن توی قسمت ایندکس وارد کنFileIOPermission.AllLocalFiles Propertyهمین مثال اون تو هست

Sub Zero
پنج شنبه 05 بهمن 1385, 17:12 عصر
صالحی جان ممنون از جوابت اما همین یه ذره ای هم که در مورد FileIOPermission بلدم رو از تو msdn در اورده بودم واستفاده کردم منتها نمیدونم چرا این کد هیچ کاری نمی کنه
با نوشتن این دوخط به برنامه می فهمونم که اجازه دسترسی به همه فایلها رو بده اما باز کار نمیکنه و سر بررسی فولدر System Volume Information ایراد می گیره .

programmermp
پنج شنبه 05 بهمن 1385, 17:34 عصر
صالحی جان ممنون از جوابت اما همین یه ذره ای هم که در مورد FileIOPermission بلدم رو از تو msdn در اورده بودم واستفاده کردم منتها نمیدونم چرا این کد هیچ کاری نمی کنه
با نوشتن این دوخط به برنامه می فهمونم که اجازه دسترسی به همه فایلها رو بده اما باز کار نمیکنه و سر بررسی فولدر System Volume Information ایراد می گیره .


ببین مصطفی جان

من هر چی با این کدها ور رفتم دیدم نمی شه یک جوری به ان گفت که اگه به فلان

دایرکتوری رسیدی ردش کن یعنی اسکن نکن

فکر کنم باید از طریق دیگری به اسکن فایلها بپردازی یا به عبارت دیگه این روش رو بیخیال شی

البته این نظر منه شاید راه دیگه ای هم باشه

حامد مصافی
پنج شنبه 05 بهمن 1385, 17:44 عصر
سلام
شما باید روتین های جستجوی فایل ها رو خودتون بنویسید

در واقع نیاز به چیزی مثل این دارین
(غلط گیزی به عهده خودتون)


imports system.io


sub searchDir(dirname)
for each d as directory in dirname.getSubDirectories
searchDir (d.path)
searchFile (d.path)
next
end sub
sub searchFiles(dirName)
for each f as fileInfo in dirName.getFiles
listbox1.items.add f.fullname
next
end sib


و اینم شکل استفاده


call searchDir("C:\")

programmermp
پنج شنبه 05 بهمن 1385, 18:14 عصر
من که نتونستم مشکلاتش رو برطرف کنم

کسی تونست برای ما هم بزاره اصلاح شدشو

با تشکر

Ner'zhul Arthas
پنج شنبه 05 بهمن 1385, 20:56 عصر
من که جست و جو میکنم درست جواب میده.
مطمئنید مشکل از اینه؟

Sub Zero
جمعه 06 بهمن 1385, 11:00 صبح
حامد جان گفته بودم روشهای زیادی برای این کار هست
اینم یه روش دستی که به صورت بازگشتیه اما اخرش باید این فولدر مزاحم چک بشه والا برنامه erorr میده :عصبانی:

obj="c:\"
exten="*.pdf"
Sub srch(ByVal obj As Object, ByVal exten As String)
If IO.Directory.GetDirectories(obj).Length = 0 Then
For Each f As Object In My.Computer.FileSystem.GetFiles(obj, FileIO.SearchOption.SearchTopLevelOnly, exten)
lsw.Items.Add(f.ToString)
Next
Else
For Each f As Object In IO.Directory.GetDirectories(obj)
If f.ToString = obj & "System Volume Information" Then
Exit For
End If
srch(f, exten)
Next
End If
End Sub
بابا حتما باید یه راهی باشه والا ماکروسافت بیکار نبوده که یه خط کد رو به جای این چند خط کد بالا تو vb گذاشته
شاید راهش این باشه که اول اون فولدر مزاحم رو از حالت سیستمی در بیاریم بعد کارمون رو انجام بدیم . :متفکر:

Amir Taghavi
جمعه 06 بهمن 1385, 12:42 عصر
البته فکر کنم این بهتر باشه!!! :


For Each drive As String In IO.Directory.GetLogicalDrives

Try

For Each directory As String In IO.Directory.GetDirectories(drive)

Dim dirinfo As New IO.DirectoryInfo(directory)

If dirinfo.Attributes = 22 Or dirinfo.Attributes = 8211 Then

Continue For
End If

For Each file As String In IO.Directory.GetFiles(dirinfo.FullName, "*.txt", IO.SearchOption.AllDirectories)

Me.ListBox1.Items.Add(file)
Me.ListBox1.Refresh()
Next
Next
Catch ex As Exception

'Do Nothing!
End Try
Next

اگه میشه یه نگاه هم به این بندازین:

http://barnamenevis.org/forum/showthread.php?t=59956

Sub Zero
جمعه 06 بهمن 1385, 13:38 عصر
امیر جان خودت که بهتر میدونی حلقه های تودر تو اونم از نوع For خوانایی برنامه رو پایین می یاره .
در ضمن من فقط میخوام یکی بگه چرا این کد کار نمیکنه :


files = My.Computer.FileSystem.GetFiles("c:\", FileIO.SearchOption.SearchAllSubDirectories, "*.pdf")

اگه قرار بود خودم روتین جستجو رو بنویسم پس ماکروسافت اینو واسه چی گذاشته :عصبانی++:

Amir Taghavi
جمعه 06 بهمن 1385, 13:52 عصر
اگه قرار بود که سه سوت همه dir ها رو بگردی پس تکلیف permission ها چی میشه؟!!!

Sub Zero
جمعه 06 بهمن 1385, 16:58 عصر
اگه قرار بود که سه سوت همه dir ها رو بگردی پس تکلیف permission ها چی میشه؟!!!

امیر خان تازه رسیدی به سوالی که توی پست شماره 1 و 2 مطرح کردم تو می تونی دو خط کد بنویسی که برنامه اجازه دسترسی به اون فولدر رو داشته باشه ؟ :متفکر:

Amir Taghavi
شنبه 07 بهمن 1385, 07:08 صبح
شاید بشه به بعضی Folder ها از طریق کد دسترسی پیدا کرد اما بعیده که OS به تو اجازه دسترسی به System Volume Information رو بده. اسمش روشه و دلیلی وجود نداره User درون این Folder رو ببینه.

Sub Zero
شنبه 07 بهمن 1385, 09:28 صبح
بعیده که OS به تو اجازه دسترسی به System Volume Information رو بده. اسمش روشه و دلیلی وجود نداره User درون این Folder رو ببینه.

به ما که رسید دلیلی نداره بهش دسترسی داشته باشیم . اگه یه نگاه به نحوه عملکرد انتی ویروسها بندازی می بینی که بیشتر ویروسها رو توی همین فولدر پیدا می کنند . منم همین کار رو می خوام انجام بدم . (البته نه در اون حد ) .
مطمئنم یه راهی وجود داره . :عصبانی++:

حامد مصافی
شنبه 07 بهمن 1385, 10:29 صبح
البته فکر کنم این بهتر باشه!!! :


For Each drive As String In IO.Directory.GetLogicalDrives
Try
For Each directory As String In IO.Directory.GetDirectories(drive)
....
Next
Catch ex As Exception
'Do Nothing!
End Try
Next

اگه میشه یه نگاه هم به این بندازین:

http://barnamenevis.org/forum/showthread.php?t=59956



سلام
به نظر شما با دو حلقه For تو در تو میشه تمام فایل ها و زیر فولدر ها رو بررسی کرد؟
اگر با الگوریتم پیمایش درخت آشنایی داشتید راحت تر می تونستید این کار رو انجام بدید!
نگاهی به شبه کدی که نوشتم بیندازید




بابا حتما باید یه راهی باشه والا ماکروسافت بیکار نبوده که یه خط کد رو به جای این چند خط کد بالا تو vb گذاشته



اگه قرار بود خودم روتین جستجو رو بنویسم پس ماکروسافت اینو واسه چی گذاشته :عصبانی++:


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

فضای نامی My اصولاً برای رفع مشکلات یا تکامل سایر فضا های نامی نوشته نشده! این فضای اسمی (My) به منظور تدارک چند عمل پرکاربرد و ساده نوشته شده! همین! این فضای اسمی چند امکان رو در اختیار شما قرار میده اما اگر قرار باشه به کدتونو حرفه ای تر بکنید یا امکانات دیگه ای بهش اضافه کنید باید خودتون دست به کار بشید


به ما که رسید دلیلی نداره بهش دسترسی داشته باشیم . اگه یه نگاه به نحوه عملکرد انتی ویروسها بندازی می بینی که بیشتر ویروسها رو توی همین فولدر پیدا می کنند . منم همین کار رو می خوام انجام بدم . (البته نه در اون حد ) .
مطمئنم یه راهی وجود داره . :عصبانی++:
آنتی ویروس شما تا حالا ویروسی رو در مسیر زیر پیدا کرده؟؟

%WinDrive%\System Volum Information

Sub Zero
شنبه 07 بهمن 1385, 15:58 عصر
آنتی ویروس شما تا حالا ویروسی رو در مسیر زیر پیدا کرده؟؟
%WinDrive%\System Volum Information
بله ویروس یا بهتره بگم worm با نام Born.Tak که خودش رو همه جا انتشار میده حتی توی شبکه داخلی . توی این فولدر هم تا دلت بخواد از خودش رد پا می زاره . در ضمن با Kasper Sky هم تونستم از شرش خلاص شم .

حامد مصافی
شنبه 07 بهمن 1385, 17:50 عصر
بله ویروس یا بهتره بگم worm با نام Born.Tak که خودش رو همه جا انتشار میده حتی توی شبکه داخلی . توی این فولدر هم تا دلت بخواد از خودش رد پا می زاره . در ضمن با Kasper Sky هم تونستم از شرش خلاص شم .

یک بار دیگه بررسی کن! ببین به فولدری که ویندوز بهت اجازه وارد شدن نمیده ویروس وارد شده؟؟؟ در System Volum Information سایر درایو ها ممکنه ولی در فالدر درایو ویندوز (به دلایل مجوز و امنیتی) ممکن نیست هر کس برای ورود به این فولدر باید مجوز سیستم رو داشه باشه

programmermp
شنبه 07 بهمن 1385, 20:07 عصر
یک بار دیگه بررسی کن! ببین به فولدری که ویندوز بهت اجازه وارد شدن نمیده ویروس وارد شده؟؟؟ در System Volum Information سایر درایو ها ممکنه ولی در فالدر درایو ویندوز (به دلایل مجوز و امنیتی) ممکن نیست هر کس برای ورود به این فولدر باید مجوز سیستم رو داشه باشه

خوب شاید اون ویروس که اقا مصطفی می گن

این مجوز رو داشته

یا اگه هم نداشته بلد بوده چطوری از این مجوز عبور کنه یا به عبارتی دیگر مجوز رو

حذف کنه یه همچین چیزهایی ............

ببینید با iopermision نمی شه یه جوری مجوز رو از روی این فولدر برداشت

بعد از انجام عملیات دوباره مجوز رو گذاشت؟