2013-07-14 73 views
1

我試圖移動一個文件,沒有什麼聰明的。移動文件,AX2012

我遇到的問題在AX WONDERS blog中有解釋。

這樣做的原因是,使用該服務器上運行的AX類時,除了永不再來給客戶,因此不能正確處理....操作不會陷入異常: :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 
+0

爲什麼刪除,拷貝,刪除的事情嗎? –

+0

只是一個簡單的'移動'會更好,我同意。但第一次刪除是爲了確保目的地是免費的,然後再複製文件。 –

+0

然後做一個'System.IO.File :: Delete(newFileName);'第一個。不要忘記趕上'CLRError'。 –

回答

1

我會去的,而不是被巧妙的

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

。 考慮以前存在的newFileName錯誤。

不要在服務器或批處理上下文中使用WinAPI文件方法(您已檢查過)。
同時使用WinAPIWinAPIServer太痛苦了,請直接使用.Net方法。

最有可能的是fileLocked錯誤。

0

您正試圖訪問newFileName而不聲明對其的權限。而且,isRuningOnServer()方法在批處理過程中並不像預期的那樣工作,所以我會調查它在你的情況下是否工作正常。

0

即使您將對象指定爲null,TextIo及其基類也不會在批處理中釋放文件讀取鎖定。

用StreamReader重寫導入並使用.close()和.dispose(),它將起作用。

編輯: 呼叫的finalize()上TEXTIO批量運行時,將關閉該文件,也。

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