AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 27.11.2003, 10:02   #1  
NJD is offline
NJD
Участник
 
210 / 26 (1) +++
Join Date: 21.05.2003
Location: Moscow
WinApi. Удаление файлов глючит.
есть метод, который должен проверить каталог, на содержание txt файлов, и удалить их, в случае согласия пользователя.
В общем не пашет это дело - не хочет он удалять первый найденный файл, и зацикливается...
Я так понимаю, из-за того что hanlom захватывает axapta этот файл и держит.
WinApi::closeHandle(handle) и WinApi::findClose(handle); не помогают...
Никто не подскажет, что я не так делаю? Спасибо.


int deleteAllFiles()
{
int handle=0;
str fn='';
DialogButton db;
;
handle =conpeek(WinApi::findFirstFile(pathname+"\\*.txt"),1);
if (handle != -1)
{
db = BOX::yesNo("В указанном каталоге уже есть TXT файлы!!! Удалить их?",DialogButton::Yes);

if (db == DialogButton::Yes)
{
WinApi::closeHandle(handle);
WinApi::findClose(handle);
do
{

fn = conpeek(WinApi::findFirstFile(pathname+"\\*.txt"),2);
handle =conpeek(WinApi::findFirstFile(pathname+"\\*.txt"),1);
WinApi::deleteFile(pathname+'\\'+fn);
}
while (fn);
}
if (db == DialogButton::No)
{
return(0);
}
}
return(1);
}
Old 27.11.2003, 12:34   #2  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Надо бы потестировать, жаль пока некогда...
Но навскидку, мне кажется, дело в многократном вызове FindFirstFile. Интуитивно чувствую, что нужно использовать вместо этого FindNextFile.

Может, и ошибаюсь...
Old 27.11.2003, 14:59   #3  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Вот рабочий код:

int deleteAllFiles()
{
int Handle=0;
str FileName;
str Path = 'D:\\Temp';
dialogButton Db;

[Handle, FileName] = WinApi::findFirstFile(Path + '\\*.txt');
if (Handle == -1) return -1; // not found

Db = BOX::yesNo("В указанном каталоге уже есть TXT файлы!!! Удалить их?", DialogButton::Yes);
if (Db == DialogButton::No) return 0;

while (FileName)
{
WinApi::deleteFile(Path + '\\' + FileName);
FileName = WinApi::findNextFile(Handle);
}
WinApi::findClose(handle);
return 1;
}

Ваши ошибки:
1. Как я и думал, нужно было использовать FindNextFile
2. Нельзя было выполнять WinApi::findClose(handle), не закончив операцию;
3. Использование не совсем традиционного способа вытаскивания значений из контейнера (conpeek) привело к повторному вызову функции FindFirstFile, что само по себе некорректно.

Желаю удачи в нелегком деле удаления AllFiles с AllDrives

PS: Ради интереса посмотрите реализацию класса CCCopyDirectory.
This post has been rated by: Gustav (5), alex55 (1), Logger (3).
Old 28.11.2003, 12:16   #4  
NJD is offline
NJD
Участник
 
210 / 26 (1) +++
Join Date: 21.05.2003
Location: Moscow
да чего-то тоже не пашет -((( - также захватывает файлы, и ничего не делает...
никто не поделится кодом, который просто чистит в заданном каталоге все txt файлы.
спасибо.
Old 28.11.2003, 12:22   #5  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Все пашет!
Если б не работало, я бы не послал этот постинг.
Что-то у тебя с системой нелады...
Может, дело в доступе к каталогу. Проверь права юзера, от имени которого запущена Аксапта.
Old 28.11.2003, 17:19   #6  
wit is offline
wit
NavAx
NavAx Club
 
11 / 10 (1) +
Join Date: 21.05.2003
Хочу добавить информацию по данной проблеме.
Перед тем как вызвать метод удаления файлов выполняется следующий код создания этих файлов :
...
int i;
str filename;
;
for ( i=1; i<= conlen(files); i+=1)
{
if (! WinApi::fileExistsClient(conpeek(files,i)))
WinAPI::createFile(conpeek(files,i));
}
...
Далее идет запись в эти файлы.


После этого при попытке удалить все файлы из каталога ,
возникает ошибка на файле , который создался первым.
Все остальные удаляются.

Если не создавать файлы при помощи кода указанного выше ,
данный метод удаления работает корректно.
Old 01.12.2003, 11:25   #7  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Желательно после CreateFIle и работы с файлами закрывать их хандлеры, то есть использовать
WinAPI::closeHandle(handle);
Кроме того, если запись в файлы осуществляется при помощи классов-наследников IO, то они тоже любят оставлять за собой файлы открытыми. Причем явно вызвать метод finalize() не получается. Зато в хелпе читаем:
Quote:
Close the file and, if data was written, flush the file buffers to disk. The object is normally finalized by leaving the scope so finalize is normally not called directly.
Исходя из чего, пытаемся смоделировать leaving the scope, то есть кусок кода, отвечающего за запись в файлы, вынести в отдельный метод, дабы при выходе из него и происходил желанный нами finalize(). Таким образом и достигаем желаемого результата:
PHP Code:
void write2file(str _FileNamestr _Data)
{
    
asciiIO File = new asciiIO(_FileName'W');
    
File.write(_Data);
}
..................

int deleteAllFiles()
{
    
int Handle=0i;
    
str FileName;
    
str Path 'D:\\\\Temp';
    
dialogButton Db;
    
container Files = ['1.txt''2.txt''ABC.txt'];

    for (
i=1i<=conlen(Files); i++)
    {
        
FileName conpeek(Files,i);
        
this.write2file(Path "\\\" + FileName, 'test string');
    }
// во время приостановки Х++ кода можно убедиться в присутствии файлов
    pause; 
    [Handle, FileName] = WinApi::findFirstFile(Path + '\\\\*.txt');
    if (Handle == -1) return -1; // not found

    Db = BOX::yesNo("
В указанном каталоге уже есть TXT файлы!!! Удалить их?",DialogButton::Yes);
    if (Db == DialogButton::No) return 0;

    while (FileName)
    {
        WinApi::deleteFile(Path + "
\\\\" + FileName);
        FileName = WinApi::findNextFile(Handle);
    }
    WinApi::findClose(handle);
    return 1;

PS: Если я опять что-то не так понял, опишите задачу поподробнее...
Old 01.12.2003, 15:28   #8  
wit is offline
wit
NavAx
NavAx Club
 
11 / 10 (1) +
Join Date: 21.05.2003
Вот тестовый job-ик . В нем для простоты отсутствуют процедуры записи. Только создание и попытка удаления файлов. Почему возникает ошибка удаления ?

static void Testdf(Args _args)
{

container Files = ['1.txt', '2.txt', 'ABC.txt'];
int Handle=0, i;
str FileName;
str Path = 'C:\\Temp\\';
dialogButton Db;
int DelFileErrCode;
;
for ( i=1; i<= conlen(files); i+=1)
{
if (! WinApi::fileExistsClient(Path+conpeek(files,i)))
{
WinAPI::createFile(Path+conpeek(files,i));
}
}

pause;
[Handle, FileName] = WinApi::findFirstFile(Path + '*.txt');
if (Handle == -1) return;
Db = BOX::yesNo(" В указанном каталоге существуют файлы. Удалить?",DialogButton::Yes);
if (Db == DialogButton::Yes)
{
while (FileName)
{
WinApi::deleteFile(Path + FileName);
DelFileErrCode = WinApi::deleteFile(Path + FileName);
if (DelFileErrCode != 0)
{
box::info(' Ошибка № ' + int2str(DelFileErrCode) + ' при удалении файла ' + Path + FileName);
}
FileName = WinApi::findNextFile(Handle);
}
WinApi::findClose(handle);
}
}
Old 01.12.2003, 15:53   #9  
olesh is offline
olesh
Участник
 
58 / 26 (1) +++
Join Date: 02.04.2002
Location: Москва
Ошибка возникает потому, что файл остается открытым после createFile.
Old 01.12.2003, 16:05   #10  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Опять те же грабли: не освобождаете после себя хандлеры. В приведенном коде добавим одну строчку в цикл создавания файлов:

PHP Code:
...
for ( 
i=1i<= conlen(files); i+=1)
{
  if (! 
WinApi::fileExistsClient(Path+conpeek(files,i)))
  {
    
Handle WinAPI::createFile(Path+conpeek(files,i));
    
WinAPI::closeHandle(Handle); // в противном случае Аксапта "не отпускает" файлы 
  
}
}
... 
А вообще-то, при использовании классов-наследников IO можно обойтись без createFile, поскольку их конструкторы сами создают файл, если его не находят. (См. функцию write2file() в предыдущем постинге)

Ну вот, пока писал, опередили...
Old 05.12.2003, 13:31   #11  
NJD is offline
NJD
Участник
 
210 / 26 (1) +++
Join Date: 21.05.2003
Location: Moscow
Большое спасибо. Всё заработало... -)
Просто аксапта почему-то намертво держала при создании только первый файл (а все отсальные удалялялись (если руками их удалять) ). Поэтому и начал искать грабли в процедуре удаления файлов.
Tags
открытие файла, поиск файлов, удаление файла

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Печать самих файлов PDF Владимир Максимов DAX: База знаний и проекты 9 17.08.2017 10:34
Axapta WinAPI::SewWindow... кто знает как? UNRW DAX: Программирование 2 26.09.2008 15:28
Dynamics AX Geek: Finding files with WinAPI Blog bot DAX Blogs 0 28.10.2006 16:40
WinAPI. Ссылка (POINT) третьего уровня вложенности Владимир Максимов DAX: Программирование 2 06.02.2006 16:28
WinAPI::getLastError() DreamCreator DAX: Программирование 4 20.06.2005 10:03

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 01:49.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.