09.10.2008, 16:51 | #1 |
Участник
|
как найти файл?
Всем привет!
Может тема и была, но найти не смог.. Как программно можно найти точное местоположение файла на диске? Ну например файл "hosts" найти на диске C:\ результатом поиска должны быть варианты, в данном случае 1 вариант "c:\WINDOWS\system32\drivers\etc\hosts" спасибо! |
|
09.10.2008, 17:06 | #2 |
Участник
|
Ну, я знаю только тупой перебор файлов в C
|
|
09.10.2008, 17:09 | #3 |
Участник
|
а как по каталогам шариться? тем более что мне заранее не известен даже уровень вложенности...
я давно умел такое на делфи делать подсткажите как в аксапте |
|
09.10.2008, 17:23 | #4 |
Участник
|
|
|
09.10.2008, 17:58 | #5 |
Участник
|
Угу.
Там в блоге есть пример поиска на диске. Только реализация проверки на вложенную папку замедляет поиск. X++: static void FindFilesOnDisk(Args _args) { DLL _winApiDLL = new DLL('KERNEL32'); DLLFunction _findNextFile = new DLLFunction(_winApiDLL, 'FindNextFileA'); #define.FILE_ATTRIBUTE_DIRECTORY(0x00000010) container findNextFileLoc(int handle) { Binary data = new Binary(0x200); ; if (_findNextFile.call(handle, data)) return [data.DWord(0), data.string(44)]; return connull(); } void findFilesOnDisk(str _path, FileName _fileName) { container files; container c; FileName fileName; boolean directory; ; if (substr(_path, strlen(_path), 1) != "\\") _path += "\\"; files = WinApi::findFirstFile(_path + "*.*"); if (files != connull() && conpeek(files, 1) != -1) { fileName = conpeek(files, 2); directory = conpeek(files, 3); while (fileName) { if (directory && fileName != "." && fileName != "..") findFilesOnDisk(_path + fileName + "\\", _fileName); else if (fileName == _fileName) info(_path + _fileName); c = findNextFileLoc(conpeek(files, 1)); if (c == connull()) break; fileName = conpeek(c, 2); directory = conpeek(c, 1) & #FILE_ATTRIBUTE_DIRECTORY != 0; } WinApi::findClose(conpeek(files, 1)); } } ; _findNextFile.returns(ExtTypes::DWord); _findNextFile.arg(ExtTypes::DWord, ExtTypes::Pointer); findFilesOnDisk("c:\\", "hosts"); }
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: gefr (1). |
10.10.2008, 14:44 | #6 |
Участник
|
слушай AndyD, ну ты мощный перец!
Спасибо!!! С меня пиво |
|
01.02.2016, 15:48 | #7 |
Участник
|
Большое спасибо AndyD.
Мне надо было получать все файлы из папки и подпапок по маске. переделал: X++: static container FindFiles(str Path,str Mask) { DLL _winApiDLL = new DLL('KERNEL32'); DLLFunction _findNextFile = new DLLFunction(_winApiDLL, 'FindNextFileA'); container res; #define.FILE_ATTRIBUTE_DIRECTORY(0x00000010) container findNextFileLoc(int handle) { Binary data = new Binary(0x200); ; if (_findNextFile.call(handle, data)) return [data.DWord(0), data.string(44)]; return connull(); } void findFilesOnDisk(str _path) { container files; container c; FileName fileName; boolean directory; ; if (substr(_path, strlen(_path), 1) != "\\") _path += "\\"; files = WinApi::findFirstFile(_path + "*.*"); if (files != connull() && conpeek(files, 1) != -1) { fileName = conpeek(files, 2); directory = conpeek(files, 3); while (fileName) { if (directory && fileName != "." && fileName != "..") findFilesOnDisk(_path + fileName + "\\"); else if(subStr(fileName,strLen(fileName)-2,strLen(fileName))==Mask)res+=(_path + fileName); c = findNextFileLoc(conpeek(files, 1)); if (c == connull()) break; fileName = conpeek(c, 2); directory = conpeek(c, 1) & #FILE_ATTRIBUTE_DIRECTORY != 0; } WinApi::findClose(conpeek(files, 1)); } } ; _findNextFile.returns(ExtTypes::DWord); _findNextFile.arg(ExtTypes::DWord, ExtTypes::Pointer); res=conNull(); findFilesOnDisk(Path); return res; } |
|
01.02.2016, 16:42 | #8 |
Гость
|
А не посконнее ли DirectoryInfo.GetFiles
https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx ? https://community.dynamics.com/ax/f/33/t/104585 ? Этот подход судя по классу DmfEntityBase используется как понимаю самим МС Последний раз редактировалось axm2013; 01.02.2016 в 17:07. |
|
01.02.2016, 17:16 | #9 |
Участник
|
В версиях Аксапты 4.0 и выше проще использовать System.IO.Directory.GetFiles() c SearchOption::AllDirectories
|
|