移动文件AX2012

时间:2013-07-14 08:06:25

标签: axapta file-handling dynamics-ax-2012

我正在尝试移动文件,没有什么聪明。

AX WONDERS blog中解释了我遇到的问题。

  

原因是当使用在服务器上运行的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

4 个答案:

答案 0 :(得分:1)

我会去

 System.IO.File::Move(fileName, newFileName);
而不是聪明。 考虑先前存在的newFileName错误。

请勿在服务器或批处理上下文中使用WinAPI文件方法(您已检查过) 同时使用WinAPIWinAPIServer太痛苦了,直接使用.Net方法。

fileLocked很可能是错误的。

答案 1 :(得分:0)

您尝试访问newFileName而未声明其权限。此外,isRuningOnServer()方法在批处理期间的所有情况下都无法按预期工作,因此我会调查它是否在您的情况下正常工作。

答案 2 :(得分:0)

TextIo及其基类在批量使用时不会释放文件读锁,即使您将对象指定为null也是如此。

使用StreamReader重写导入并使用.close()和.dispose(),它将起作用。

编辑: 在TextIo上调用finalize()将关闭该文件,同样在批量运行时也是如此。

答案 3 :(得分:-2)

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