【问题标题】:Move a file, AX2012移动文件,AX2012
【发布时间】:2013-07-14 08:06:25
【问题描述】:

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

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

【问题讨论】:

  • 为什么要删除、复制、删除的东西?
  • 只是一个简单的“移动”会更好,我同意。但第一次删除是为了确保目标是空闲的,然后再复制文件。
  • 然后先做一个System.IO.File::Delete(newFileName);。不要忘记抓住CLRError

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


【解决方案1】:

我会去的

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

而不是聪明。 考虑先前存在的newFileName 一个错误。

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

fileLocked 很可能是错误的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      TextIo 及其基类在批量使用时不会释放文件读取锁定,即使您将对象分配为 null。

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

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

      【讨论】:

        【解决方案4】:
        System.IO.File::Move(fileName, newFileName);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多