Переместить файл, AX2012

Я пытаюсь переместить файл, ничего умного.

Возникшая у меня проблема описана в блоге AX WONDERS< /а>.

Причина этого в том, что при использовании класса AX, работающего на сервере, исключение никогда не возвращается клиенту и, следовательно, не может быть правильно обработано.... операция не попадет в исключение Exception::CRLError

Например, если исходный файл открывается в MSWord, в методе fileLocked выдается исключение, что одновременно раздражает и в то же время забавляет.

Любые предложения приветствуются!

Некоторый код:

server static void moveFile(str fileName, str newFileName)
{
    #File
    Set                 permissionSet;
    ;

    permissionSet =  new Set(Types::Class);
    //permissionSet.add(new FileIOPermission(fileName,#io_write));
    permissionSet.add(new FileIOPermission('',#io_write));
    permissionSet.add(new InteropPermission(InteropKind::ClrInterop));

    CodeAccessPermission::assertMultiple(permissionSet);

    if (isRunningOnServer()) 
    { 
        if (WinAPIServer::fileExists(newFileName))
            WinAPIServer::deleteFile(newFileName);
        WinAPIServer::copyFile(fileName, newFileName);
        if (!WinAPIServer::fileLocked(fileName))
            WinAPIServer::deleteFile(fileName);
    }
    else
    {
        if (WinApi::fileExists(newFileName))
            WinApi::deleteFile(newFileName);
        WinAPI::copyFile(fileName, newFileName);
        if (!WinAPI::fileLocked(fileName))
            WinAPI::deleteFile(fileName);
    }
    //System.IO.File::Move(fileName, newFileName);

    CodeAccessPermission::revertAssert();
}

Реестр ошибок:

System.IO.IOException: The process cannot access the file 'M:\Interfaces\Prod\ImportacionClientes\Direcciones\XXXXXXAD_20130711_1136.TXT' because it is being used by another process.

   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)

   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)

   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)

   at System.IO.File.OpenWrite(String path)

   at Dynamics.Ax.Application.WinAPIServer.fileLocked(String _fileName) in WinAPIServer.fileLocked.xpp:line 33

   at Dynamics.Ax.Application.EVE_UlaboxInterfaceClientes_IN.moveFile(String fileName, String newFileName) in EVE_UlaboxInterfaceClientes_IN.moveFile.xpp:line 19

person ian_scho    schedule 14.07.2013    source источник
comment
Зачем удалять, копировать, удалять?   -  person Jan B. Kjeldsen    schedule 15.07.2013
comment
Простое «Move» было бы лучше, я согласен. Но первое удаление — это убедиться, что место назначения свободно, прежде чем копировать файл.   -  person ian_scho    schedule 15.07.2013
comment
Затем сначала сделайте System.IO.File::Delete(newFileName);. Не забудьте поймать CLRError.   -  person Jan B. Kjeldsen    schedule 04.08.2013


Ответы (3)


я бы пошел на

 System.IO.File::Move(fileName, newFileName);

вместо того, чтобы быть умным. Рассмотрим предшествующее существование newFileName ошибки.

Не используйте файловые методы WinAPI в контексте сервера или пакета (вы проверили это).
Использование обоих методов WinAPI и WinAPIServer слишком болезненно, сразу переходите к методам .Net.

Скорее всего ошибка fileLocked.

person Jan B. Kjeldsen    schedule 14.07.2013

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

person j.a.estevan    schedule 24.07.2013

TextIo и его базовые классы не снимают блокировку чтения файла при пакетном использовании, даже если вы присваиваете объекту значение null.

Перепишите импорт с помощью StreamReader и используйте .close() и .dispose(), и все заработает.

Изменить: вызов finalize() для TextIo закроет файл, в том числе при пакетном запуске.

person Pontus    schedule 14.10.2014