Laden...

Exception beim Verwenden des CopyJob von QuickIO

Erstellt von major0190 vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.248 Views
M
major0190 Themenstarter:in
14 Beiträge seit 2012
vor 9 Jahren

Hallo,

ich sollte mal ein wenig Hilfe habe. Bin ziemlich neu in C#.
Wir geht es um folgendes. Ich muss Outlook-PST-Dateien kopieren und die sind öfters mal 10GB groß. Da der User nicht weiß ob der Rechner noch was macht, würde ich ganz gerne einen Fortschrittsbalken einbauen. Habe dann dieses Skript gefunden mit dem es funktionieren soll. Habe jetzt zum testen nur mal eine WinForm, mit einem Label und Button erstellt. Der Butten starten den Kopierprozess. Die Datei wird auch ordentlich kopiert. Nur schaffe ich es nicht, dass zumindest das Label während des Kopierens auf "Copy" umschaltet. Beim debuggen springt er mit auch in "private void OnCopyProgress..." aber der Debugger möchte dann eine "QuickIOTransferFileCopyJob.cs" haben???? Was funktioniert: Zum Schluss wird das Label auf "Ende" gesetzt.

Habe mal meinen Code angehängt. QuickIO habe ich über NuGet installiert.
Vielen Dank für Eure Hilfe

Thomas


using SchwabenCode.QuickIO.Transfer;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace copytest
{
    public partial class Form1 : Form
    {
        string sourcefile = string.Empty;
        string destfile = string.Empty;

        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        public void CopyJob(String sourceFile, String targetDirectory, Int32 maxBufferSize)
        {
            var copyJob = new QuickIOTransferFileCopyJob(sourceFile, targetDirectory, maxBufferSize, overwrite: true, parentExistanceCheck: true);

            copyJob.Started += OnCopyStarted;
            copyJob.Progress += OnCopyProgress;
            copyJob.Finished += OnCopyFinished;

            copyJob.Run();
        }

        private void OnCopyStarted(object sender, SchwabenCode.QuickIO.Transfer.Events.QuickIOTransferFileCopyStartedEventArgs e)
        {
            label1.Text = "Start";
        }

        private void OnCopyProgress(object sender, SchwabenCode.QuickIO.Transfer.Events.QuickIOTransferFileCopyProgressEventArgs e)
        {
            label1.Text = "Copy";
        }

        private void OnCopyFinished(object sender, SchwabenCode.QuickIO.Transfer.Events.QuickIOTransferFileCopyFinishedEventArgs e)
        {
            label1.Text = "End";
        }

        private void btn_start_Click(object sender, EventArgs e)
        {
            sourcefile = @"C:\Eigene Dateien\Outlook\Archiv 2012.pst";
            destfile = @"c:\temp\test\Archiv 2012.pst";
            CopyJob(sourcefile, destfile, 65535);
        }
    }
}

16.835 Beiträge seit 2008
vor 9 Jahren

Erstmal bitte ich Dich darum nicht den Projekt-Thread für Fehler zu verwenden, sondern ein eigenes Thema zu erstellen.
Ich hab das jetzt mal im Forum abgetrennt....

Zunächst kann ich Dir (oder auch jeder andere) ziemlich schlecht helfen, wenn Du mir nicht die entsprechende Exception sagst (oder per Screenshot zeigst).
Das sollte der Debugger immer tun.

Vom Code her kann ich Dir gleich sagen: Du hast selbst die Methode CopyJob erstellt, der zweite Parameter lautet target**Directory** - Du gibst ihm aber ein **File**Path. Das kann natürlich nicht klappen: er will einen Verzeichnispfad und keine Datei.

M
major0190 Themenstarter:in
14 Beiträge seit 2012
vor 9 Jahren

Hallo,

sorry, dass war keine Absicht das Posting doppelt reinzusetzen. War vorher verwundert, dass es nicht mehr da war und dacht ich hätte es vergessen zu speichern. Habe erst gerade Deine Nachricht gesehen.

Habe den destfile geändert auf: destfile = @"c:\temp\test";

Auf c:\temp\test sollte eigentlich schon eine Berechtigung sein und die Quelldatei ist auch nicht im Zugriff. Die Exception kommt bei copyJob.Run();
Danke für Deine Hilfe

Fehlermeldung:
System.UnauthorizedAccessException wurde nicht behandelt.
HResult=-2147024891
Message=Access to 'c:\temp\test' denied.
Source=SchwabenCode.QuickIO
StackTrace:
bei SchwabenCode.QuickIO.Internal.InternalQuickIOCommon.NativeExceptionMapping(String path, Int32 errorCode)
bei SchwabenCode.QuickIO.QuickIOFile.OpenFileStream(QuickIOPathInfo pathInfo, FileAccess fileAccess, FileMode fileOption, FileShare shareMode, Int32 buffer)
bei SchwabenCode.QuickIO.QuickIOFile.Open(QuickIOPathInfo pathInfo, FileMode mode, FileAccess access, FileShare share)
bei SchwabenCode.QuickIO.Transfer.QuickIOTransferFileCopyJob.Implementation()
bei SchwabenCode.QuickIO.Transfer.QuickIOTransferJob.Run()
bei copy2.Form1.CopyJob(String sourceFile, String targetDirectory, Int32 maxBufferSize) in c:\Eigene Dateien\C#\Projekte\copy_file_processbar_backgroundworker\copy2\copy2\Form1.cs:Zeile 44.
bei copy2.Form1.button1_Click(Object sender, EventArgs e) in c:\Eigene Dateien\C#\Projekte\copy_file_processbar_backgroundworker\copy2\copy2\Form1.cs:Zeile 33.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager. System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei copy2.Program.Main() in c:\Eigene Dateien\C#\Projekte\copy_file_processbar_backgroundworker\copy2\copy2\Program.cs:Zeile 19.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException: System.ComponentModel.Win32Exception
HResult=-2147467259
Message=Zugriff verweigert
ErrorCode=-2147467259
NativeErrorCode=5
InnerException:

M
major0190 Themenstarter:in
14 Beiträge seit 2012
vor 9 Jahren

Hallo,

hmmm, wenn ich den destfile nur auf ein Verzeichnis stelle kommt die Fehlermeldung von oben. Wenn ich aber noch einen Dateinamen hinzufüge, kopiert er ordentlich die Datei. Nur die Aktualisierung des Labels beim OnCopyProgress funktioniert nicht. OnCopyFinished ist das mit END drin???

M
major0190 Themenstarter:in
14 Beiträge seit 2012
vor 9 Jahren

Hallo,

hat sich glaube ich erledigt. Es hat bei OnCopyProgress... ein label1.refresh(); gefehlt.

Danke Dir schön für die Hilfe
Thomas

M
major0190 Themenstarter:in
14 Beiträge seit 2012
vor 9 Jahren

Hallo,

jetzt habe ich doch noch ein Problem. Habe mal alles in einen Backgroundwork geworfen, damit der Benutzer auch noch das Winform bewegen kann während die Datei kopiert. Funktioniert auch alles soweit.

Würde jetzt nur noch gerne eine Funktion einbauen, dass der Benutzer den Kopiervorgang auch während des Kopieren auch noch abbrechen kann. Da es um Outlook-PST-Dateien geht, sind diese meisten zwischen 5-10GB groß. Leider schaffe ich es nicht während des kopieren diesen Vorgang abzubrechen. Er zeigt erst nachdem die Datei fertig kopiert wurde - "Kopieren abgebrochen".

Habe mal meinen aktuelle Code angehängt.
Danke für die Hilfe.
Thomas


using SchwabenCode.QuickIO.Transfer;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace copy3
{
    public partial class Form1 : Form
    {
        string sourcefile = string.Empty;
        string destfile = string.Empty;
        public long Amount_CopiedBytes;
        
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;

            myWorker.DoWork += new DoWorkEventHandler(myWorker_DoWork);
            myWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(myWorker_RunWorkerCompleted);
            myWorker.ProgressChanged += new ProgressChangedEventHandler(myWorker_ProgressChanged);
            myWorker.WorkerReportsProgress = true;
            myWorker.WorkerSupportsCancellation = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void myWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            if(myWorker.CancellationPending)
            {
                e.Cancel = true;
            }
            else
            {
                sourcefile = @"C:\Eigene Dateien\Outlook\Archiv 2012.pst";
                destfile = @"c:\temp\test.pst";
                var copyJob = new QuickIOTransferFileCopyJob(sourcefile, destfile, 65535, overwrite: true, parentExistanceCheck: true);

                //copyJob.Started += OnCopyStarted;
                copyJob.Progress += OnCopyProgress;
                //copyJob.Finished += OnCopyFinished;

                copyJob.Run();
            }
         }

        private void OnCopyProgress(object sender, SchwabenCode.QuickIO.Transfer.Events.QuickIOTransferFileCopyProgressEventArgs e)
        {
            int percent = (int)e.Percentage;
            progressBar1.Value = percent;
            lbl_filesize.Text = (e.TotalBytes / 1000000).ToString() + " MB";
            lbl_percent.Text = percent.ToString() + " %";
        }

        private void myWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
        }

        private void myWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if(e.Cancelled)
            {
                lbl_filesize.Text = "Kopieren abgebrochen";
            }
            else
            {
                lbl_filesize.Text = "Kopieren fertig";
            }

            btn_start.Text = "Start";
        }
       
        private void btn_start_Click(object sender, EventArgs e)
        {
            if(myWorker.IsBusy)
            {
                myWorker.CancelAsync();
            }
            else
            {
                btn_start.Text = "Abbrechen";
                myWorker.RunWorkerAsync();
            }
        }
    }
}

16.835 Beiträge seit 2008
vor 9 Jahren

Stand heute bietet QuickIO.NET keine Cancallation von Jobs an.
Das ist in der aktuellen Dev-Branch schon drinne, aber nicht im Stable Release.

Vermutlich Ende Februar ist das dann im Stable. Solange musst Du mit dem harten Abort o.Ä. arbeiten.

M
major0190 Themenstarter:in
14 Beiträge seit 2012
vor 9 Jahren

Hallo,

danke für die Info. Wenn Du Lust hast, kannst Du mir die aktuelle Version schicken - da kann ich ja ein bisschen BETA-Tester spielen. Ist bei mir im Augenblick ja auch noch nicht produktiv.

Ansonsten auch kein Problem, dann wird die Abbrechen-Schaltfläche solange deaktiviert 😉
Danke auch für die Unterstützung. Ist der Code so einigermaßen OK? Da ich in den C#-Anfängen bin, bin ich natürlich über jede Kritik/Fehler dankbar.

LG Thomas