1

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

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
4

4 回答 4

1

我会去的

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

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

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

很可能fileLocked是错误的。

于 2013-07-14T21:40:52.587 回答
0

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

于 2013-07-24T14:48:45.423 回答
0

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

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

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

于 2014-10-14T06:05:24.987 回答
-2
System.IO.File::Move(fileName, newFileName);
于 2016-03-24T05:14:55.607 回答