Verschieben einer Datei, AX2012
Ich versuche, eine Datei verschieben, nichts gescheites.
Das problem ich habe, ist erklärt in der AX WUNDER blog.
Der Grund dafür ist, dass bei der Verwendung einer AXT-Klasse, die auf dem server läuft, ist die Ausnahme, kommt nie wieder zurück an den client und kann deshalb nicht korrekt verarbeitet werden.... der Betrieb wird, fallen nicht in die Ausnahme::CRLError Ausnahme
Wenn die Quelldatei geöffnet ist von MSWord, zum Beispiel, wird eine Ausnahme geworfen wird, in der fileLocked Methode, die sowohl ärgerlich und doch amüsant.
Anregungen herzlich willkommen!
Code:
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();
}
Fehler Registrierung:
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
- Warum das löschen, kopieren, löschen, was?
- Nur ein einfaches "Verschieben" würde besser sein, Stimme ich zu. Aber die erste löschen, um sicherzustellen, dass das Ziel frei ist, bevor die Datei kopiert.
- Dann
System.IO.File::Delete(newFileName);
ersten. Vergessen Sie nicht, zu fangenCLRError
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde für die
anstatt zu clever.
Betrachten Sie die Vorherige Existenz der
newFileName
einen Fehler.Nicht die
WinAPI
file-Methoden, die in einem server oder batch-Kontext (Sie überprüft haben, dass).Mit beiden
WinAPI
undWinAPIServer
ist einfach zu schmerzhaft, gehen gerade für die .Net-Methoden.Wahrscheinlich die
fileLocked
Fehler ist.Den Sie zugreifen möchten, die
newFileName
ohne zu behaupten Berechtigungen auf. Außerdem, dieisRuningOnServer()
Methode funktioniert nicht wie erwartet in allen Fällen bei der batch-Verarbeitung, so dass ich dem nachgehen würde, wenn es gut funktioniert, in Ihrem Fall.TextIo und die es base-Klassen keine Freigabe für die Datei lese-gesperrt werden, wenn im batch verwendet, auch wenn Sie ordnen das Objekt null.
Schreiben Sie den import mit StreamReader und zu verwenden .close() und .dispose() und es wird funktionieren.
Bearbeiten:
Aufruf von finalize() auf TextIo wird die Datei schließen, auch wenn im batch-Betrieb.