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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.09.2003, 14:57   #1  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
? Ошибка WinAPI::setFileTimeServer2Client(...) ?
Добрый день!

Создайте на сервере AOS файл, например d:\Test.txt
Скопируйте его на клиента в c:\Test.txt

PHP код:
static void Job2(Args _args)
{
    print 
WinAPI::setFileTimeServer2Client('d:\\Test.txt','c:\\Test.txt');
    
pause;

После успешного выполнения, время модификации файла на клиенте отличается на одну две секунды от времени модификации файла на сервере...

В чем может быть ошибка?

PS
Axapta 3.0 SP1
(AOS Thin client)
__________________
Дмитрий Гришин
Старый 29.09.2003, 18:15   #2  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Данное поведение стабильно проявляется только на одном клиенте. (см. рисунок ниже)
Опробовал подключение к разным AOS серверам.

X++:
static void Job2(Args _args)
{
    #define.modified(2)
    ;
    print 'Файл на сервере: ', time2str(DVG_Common::getServerFileTime('d:\\Test.txt',#modified),1,1);
    print 'Файл на клиенте: ', time2str(WinAPI::getFileTimeEx('c:\\Test.txt',#modified),1,1);

    print 'Установим время с сервера: ', WinAPI::setFileTimeServer2Client('d:\\Test.txt','c:\\Test.txt');
    
    print 'Файл на сервере: ', time2str(DVG_Common::getServerFileTime('d:\\Test.txt',#modified),1,1);
    print 'Файл на клиенте: ', time2str(WinAPI::getFileTimeEx('c:\\Test.txt',#modified),1,1);

    pause;
}
Название: img20891-1.png
Просмотров: 764

Размер: 2.4 Кб

Пробовал на другом клиенте - там работает нормально.

Не могу найти объяснение...

Есть у кого-нибудь мысли на эту тему?
__________________
Дмитрий Гришин
Старый 29.09.2003, 18:20   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
может я не совсем в тему.
Похоже вам нужно перетащить файл с сервера на клиента.
Причем скорее всего, это какой-то нужный для работы клиента файл.

Рекомендую посмотреть на класс SysFileDeployer
и на семейство SysFileDeployment

Они как раз занимаются этой задачей.
Вызов этих классов выполняется из Info::Startup
Немного о последовательности вызова при начале работы написано здесь http://axapta.mazzy.ru/hints/startupcmd/
Старый 29.09.2003, 18:23   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
да, самое главное забыл.

Обратите внимание как копируется файл в SysFileDeployment.copy()
Старый 29.09.2003, 18:42   #5  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Цитата:
Изначально опубликовано mazzy
Похоже вам нужно перетащить файл с сервера на клиента.
Да, это действительно так...
Файл перетаскивается без видимым проблем, а вот установить дату и время исходного файла в файл назначения не получается... или получается, но не на данном клиенте...

Цитата:
Изначально опубликовано mazzy
Обратите внимание как копируется файл в SysFileDeployment.copy()
Да, я смотрел этот класс, и немного подкорректировал свой код, но факт остается фактом, что функция WinAPI::setFileTimeServer2Client(...) на данном клиенте работает не корректно... Смотрел ее код, предраться не к чему - все верно...

Остается подозрение, что виновата машина клиента, но где и что подкрутить даже на ум не приходит...
Возможно завтра придется снести клиента аксапты на этой машине и поставить заново...

Второй день пытаюсь найти ответ, но безуспешно...
__________________
Дмитрий Гришин
Старый 29.09.2003, 18:51   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
тогда не знаю
Старый 29.09.2003, 19:06   #7  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Переставил клиента Аксапты да данной машине - не помогло...

а ведь не факт что это ограничится только одной машиной...
__________________
Дмитрий Гришин
Старый 30.09.2003, 09:04   #8  
Lazy_Tiger is offline
Lazy_Tiger
NavAx
Axapta Retail User
1C
NavAx Club
 
610 / 31 (3) +++
Регистрация: 17.12.2001
Адрес: Красноярск
а может какой нить антивирусный или еще какой монитор файлик цепляет? Index service например.

ну чудеса ж... а их не бывает
__________________
И все они создания природы...
Старый 30.09.2003, 10:50   #9  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Цитата:
Изначально опубликовано Lazy_Tiger
а может какой нить антивирусный или еще какой монитор файлик цепляет? Index service например.

ну чудеса ж... а их не бывает
Да нет... файл копируется как бинарный объект. И только после того как он скопирован необходимо установить времена файла оригинала... а вот здесь и начинаются чудеса... а вы говорите их не бывает
__________________
Дмитрий Гришин
Старый 30.09.2003, 11:07   #10  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Попробовал присвоить времена одного локльного файла на машине клиента другому. Переписал WinAPI::setFileTimeServer2Client функцию в локальный job... С локальными файлами все работает нормально (см код и рисунок ниже)
X++:
static void Job11(Args _args)
{
    #winAPI
    #define.firstFile('c:\\test1.txt')
    #define.secondFile('c:\\test2.txt')
    #define.offset0(0)
    #define.offset4(4)
    #define.offset8(8)

    int hFile1, hFile2;
    Binary created_1, accessed_1, modified_1;
    Binary created_2  = new Binary(#Offset8);
    Binary accessed_2 = new Binary(#Offset8);
    Binary modified_2 = new Binary(#Offset8);

    ;
    print 'Время первого файла: ', time2str(WinAPI::getFileTimeEx(#firstFile,2),1,1);
    print 'Время второго файла: ', time2str(WinAPI::getFileTimeEx(#secondFile,2),1,1);

    hFile1 = WinAPI::createFile(#firstFile,#OPEN_EXISTING);
    if(hFile1)
    {
        created_1  = WinAPI::getFileTime(hFile1, 0); // createdServer  = WinAPI::getFileTimeServer(serverhFile, 0);
        accessed_1 = WinAPI::getFileTime(hFile1, 1); // accessedServer = WinAPI::getFileTimeServer(serverhFile, 1);
        modified_1 = WinAPI::getFileTime(hFile1, 2); // modifiedServer = WinAPI::getFileTimeServer(serverhFile, 2);

        WinAPI::closeHandle(hFile1);

        if (created_1 && accessed_1 && modified_1)
        {
            created_2.dWord(#offset0, created_1.dWord(#offset0));
            created_2.dWord(#offset4, created_1.dWord(#offset4));
            accessed_2.dWord(#offset0, accessed_1.dWord(#offset0));
            accessed_2.dWord(#offset4, accessed_1.dWord(#offset4));
            modified_2.dWord(#offset0, modified_1.dWord(#offset0));
            modified_2.dWord(#offset4, modified_1.dWord(#offset4));

            hFile2 = WinAPI::createFile(#secondFile, #OPEN_EXISTING, #GENERIC_WRITE);
            if (hFile2)
            {
                print WinAPI::setFileTime(hFile2, created_2, accessed_2, modified_2);
                WinAPI::closeHandle(hFile2);
            }
        }
    }

    print 'Время первого файла: ', time2str(WinAPI::getFileTimeEx(#firstFile,2),1,1);
    print 'Время второго файла: ', time2str(WinAPI::getFileTimeEx(#secondFile,2),1,1);

    pause;
}
Название: img20920-1.png
Просмотров: 716

Размер: 2.3 Кб

Выходит, что функция modifiedServer = WinAPI::getFileTimeServer(serverhFile, 2); возвращает неверное значение

Есть мысли?
__________________
Дмитрий Гришин
Старый 30.09.2003, 12:01   #11  
Джон is offline
Джон
Участник
 
39 / 10 (1) +
Регистрация: 05.08.2003
Так это проверить можно. Можно прям в setFileTimeServer2Client добавить:

PHP код:
        modifiedServer WinAPI::getFileTimeServer(serverhFile2);
        
info(
            
time2str(
                
WinAPI::SystemTimeToTimeOfDay(
                    
WinAPI::fileTimeToSystemTime(modifiedServer)
                )
            ,
1,1)
        ); 
и посмотреть какие там секунды будут, правильные или нет. А какой код у DVG_Common::getServerFileTime, если не секрет?
Старый 30.09.2003, 12:41   #12  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Цитата:
Изначально опубликовано Джон
Так это проверить можно. Можно прям в setFileTimeServer2Client добавить:

PHP код:
        modifiedServer WinAPI::getFileTimeServer(serverhFile2);
        
info(
            
time2str(
                
WinAPI::SystemTimeToTimeOfDay(
                    
WinAPI::fileTimeToSystemTime(modifiedServer)
                )
            ,
1,1)
        ); 
Да я пробовал так, но у меня на этом коде аксапта рушится... :(

Цитата:
Изначально опубликовано Джон

А какой код у DVG_Common::getServerFileTime, если не секрет?
Поэтому пришлось написать эту функцию:
PHP код:
// AOSRunMode::Server
server static int getServerFileTime(str _fileint _type 2)
{
    return 
WinAPI::getFileTimeEx(_file,_type);

Но видно они разные значения возвращают...

PS
В функции setFileTimeServer2Client есть такой код как:

WinAPI::closeHandle(serverhfile);

Так этот код не закрывает открытый файл на сервере... вот это точно ошибка...
пришлось написать свой код и использовать его:
PHP код:
server static boolean closeFileServer(int hFile)
{
    
DLL         _winApiDLL      = new DLL('KERNEL32');
    
DLLFunction _closeHandle    = new DLLFunction(_winApiDLL'CloseHandle');

    
_closeHandle.returns(ExtTypes::DWord);
    
_closeHandle.arg(ExtTypes::DWord);
    return 
_closeHandle.call(hFile);

__________________
Дмитрий Гришин
Старый 30.09.2003, 14:23   #13  
Джон is offline
Джон
Участник
 
39 / 10 (1) +
Регистрация: 05.08.2003
Действительно, в трех-звенке почему то падает

А если по аналогии с DVG_Common::getServerFileTime вместо "глючной" WinAPI::getFileTimeServer написать свою функцию class1::getFileTimeServer

PHP код:
// AOSRunMode::Server
server static Binary getFileTimeServer(fileName serverFileint type 0)
{
    
#WinAPI
    
int serverhFile WinAPI::createFileServer(serverFile#OPEN_EXISTING);
    
binary resfiletime;
    ;
    
resfiletime WinAPI::getFileTime(serverhFiletype);
    
WinAPI::closeHandle(serverhFile);
    return 
resfiletime;

и использовать ее в WinAPI::setFileTimeServer2Client

PHP код:
...
//        createdServer  = WinAPI::getFileTimeServer(serverhFile, 0);
        
createdServer  class1::getFileTimeServer(serverFile0);
//        accessedServer = WinAPI::getFileTimeServer(serverhFile, 1);
        
accessedServer class1::getFileTimeServer(serverFile1);
//        modifiedServer = WinAPI::getFileTimeServer(serverhFile, 2);
        
modifiedServer class1::getFileTimeServer(serverFile2);
.. 
, время одинаковым будет?
Старый 30.09.2003, 14:42   #14  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Цитата:
Изначально опубликовано Джон
время одинаковым будет?
Попробовал - не помогает, на клиенте отличается на 2 секунды в большую сторону

Самое противное, что время создания файла проставляется правильно, а ведь это одна и та же функция работает...

не понимаю...
__________________
Дмитрий Гришин
Старый 30.09.2003, 16:24   #15  
Джон is offline
Джон
Участник
 
39 / 10 (1) +
Регистрация: 05.08.2003
Попробуй такой job запустить для файла с одинаковым временем created и modified:

PHP код:
static void Job3(Args _args)
{
    
#WinAPI
    
int serverhFile WinAPI::createFileServer('D:\\ERP\\TEMP\\test.txt'#OPEN_EXISTING);
    
Binary createdServermodifiedServer;

    
createdServer WinAPI::getFileTimeServer(serverhFile0);
    
modifiedServer WinAPI::getFileTimeServer(serverhFile2);
    
WinAPI::closeHandle(serverhfile);
    print 
int2str(modifiedServer.dWord(0) - createdServer.dWord(0));
    print 
int2str(modifiedServer.dWord(4) - createdServer.dWord(4));
    
pause;

Если он не 0 0 выдаст, значит действительно WinAPI::getFileTimeServer глючит.
Старый 01.10.2003, 11:41   #16  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Джон, пробовал, но безрезультатно...
Спасибо за участие...

Я пошел другим путем...

Ветка переросла в тему: "Установить время файла"
__________________
Дмитрий Гришин
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Синтаксическая ошибка в строке объявления макробиблиотеки #WinAPI Morpheus DAX: Программирование 0 23.03.2009 15:21
Ошибка в WinAPI::moveFileEx SHiSHok DAX: Программирование 1 10.05.2007 17:01
Dynamics AX Geek: Finding files with WinAPI Blog bot DAX Blogs 0 28.10.2006 16:40
WinApi. Удаление файлов глючит. NJD DAX: Программирование 10 05.12.2003 13:31
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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