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

0

TextIo とその基本クラスは、オブジェクトに null を割り当てても、バッチで使用するとファイル読み取りロックを解放しません。

インポートを StreamReader で書き直し、.close() と .dispose() を使用すると機能します。

編集: TextIo で finalize() を呼び出すと、バッチで実行している場合もファイルが閉じます。

于 2014-10-14T06:05:24.987 に答える
0

newFileNameアクセス許可をアサートせずに にアクセスしようとしています。さらに、isRuningOnServer()バッチ処理中にすべてのケースでメソッドが期待どおりに機能するとは限らないため、あなたのケースでうまく機能するかどうかを調査します.

于 2013-07-24T14:48:45.423 に答える
-2
System.IO.File::Move(fileName, newFileName);
于 2016-03-24T05:14:55.607 に答える