AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.10.2008, 16:51   #1  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
как найти файл?
Всем привет!
Может тема и была, но найти не смог..
Как программно можно найти точное местоположение файла на диске?

Ну например файл "hosts" найти на диске C:\
результатом поиска должны быть варианты, в данном случае 1 вариант
"c:\WINDOWS\system32\drivers\etc\hosts"

спасибо!
Старый 09.10.2008, 17:06   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Ну, я знаю только тупой перебор файлов в C
Старый 09.10.2008, 17:09   #3  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
а как по каталогам шариться? тем более что мне заранее не известен даже уровень вложенности...
я давно умел такое на делфи делать подсткажите как в аксапте
Старый 09.10.2008, 17:58   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Угу.
Там в блоге есть пример поиска на диске.
Только реализация проверки на вложенную папку замедляет поиск.
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  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
слушай AndyD, ну ты мощный перец!

Спасибо!!! С меня пиво
Старый 01.02.2016, 15:48   #7  
gefr is offline
gefr
Участник
Аватар для gefr
MCBMSS
 
147 / 17 (1) ++
Регистрация: 01.11.2004
Адрес: МО, Котельники
Большое спасибо 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  
axm2013
Гость
 
n/a
А не посконнее ли 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  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
В версиях Аксапты 4.0 и выше проще использовать System.IO.Directory.GetFiles() c SearchOption::AllDirectories
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Web-портал: открыть файл cherv DAX: Программирование 4 19.05.2008 16:42
Большой Log файл у базы. Что делать? Arahnid DAX: Администрирование 4 04.04.2007 16:10
Вывод отчета в файл в пакетном режиме Egor_bl DAX: Программирование 16 09.10.2006 19:10
Как отправить файл с кодами, понятными принтеру, в порт принтера? miaa DAX: Программирование 19 18.05.2006 19:18
Проблема с записью отчета в файл st_msav DAX: Программирование 2 19.01.2006 13:02

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:48.