Laden...

[erledigt] XML Ex- Import für Logdateien: Datei wird von anderem Prozess verwendet

Erstellt von mrennen vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.349 Views
M
mrennen Themenstarter:in
166 Beiträge seit 2008
vor 11 Jahren
[erledigt] XML Ex- Import für Logdateien: Datei wird von anderem Prozess verwendet

Hallo zusammen,

ich baue mir aktuell ein kleines Hilfsprogramm welches zukünftig Logdateien per Timer zippen soll.

Dabei sollen beliebig viele Quell- und Zielpfade möglich sein, gespeichert (damit nicht jedes Mal neu eingestellt werden soll) über eine XML Datei.

Das funktioniert auch soweit bis ich z.B. bei Vorhandensein einer xml-Datei erneut auf Speichern klicke.

Dann kommt:> Fehlermeldung:

Der Prozess kann nicht auf die Datei xxxxx zugreifen, da sie von einem anderen Prozess verwendet wird.

Ich verstehe jedoch nicht wo - da ich das DataGridView zwar zu Beginn des Programmes über die xml-Datei fülle, die entsprechende Methode jedoch schon lange wieder verlassen habe...

Evtl. kann mir ja einer einen "Gedanken-Tritt" geben:

Gruß und Danke

Michael


using System.Collections.Generic;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml;

namespace ZipFiles_and_Folders
{
    public partial class frmMain : Form
    {
        DataTable _dt = new DataTable();

        public frmMain()
        {
            InitializeComponent();

            _dt.Columns.Add("Art");
            _dt.Columns.Add("Quelle");
            _dt.Columns.Add("Ziel");
            _dt.Columns.Add("Timer");
            _dt.Columns.Add("Kompression");

            Import();
        }

        private void Import()
        {
            String file = String.Format("{0}\\{1}", Application.StartupPath, "data.xml");
            if (File.Exists(file))
            {
                XmlReader importReader;
                importReader = XmlReader.Create(file, new XmlReaderSettings());
                DataSet importDataSet = new DataSet();
                importDataSet.ReadXml(importReader);
                _dt = importDataSet.Tables[0];
                dgv.DataSource = _dt;
            }
        }

        private void BtnSourceFolderClick(object sender, EventArgs e)
        {
            var source = new FolderBrowserDialog();
            if (source.ShowDialog() == DialogResult.OK)
            {
                teSourceFolder.Text = source.SelectedPath;
            }

            if (teSourceFolder.Text == String.Empty || !Directory.Exists(teSourceFolder.Text))
            {
                MessageBox.Show(@"Quell Ordner ist nicht gefüllt oder nicht existent", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                teSourceFolder.Focus();
                return;
            }
        }

        private void BtnDestinationFolderClick(object sender, EventArgs e)
        {
            var destination = new FolderBrowserDialog();
            if (destination.ShowDialog() == DialogResult.OK)
            {
                teDestinationFolder.Text = destination.SelectedPath;
            }

            if (teDestinationFolder.Text == String.Empty || !Directory.Exists(teDestinationFolder.Text))
            {
                MessageBox.Show(@"Ziel Ordner ist nicht gefüllt oder nicht existent", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                teDestinationFolder.Focus();
                return;
            }
        }

        private void BtnInsertFolderClick(object sender, EventArgs e)
        {
            if (!Directory.Exists(teSourceFolder.Text) || !Directory.Exists(teDestinationFolder.Text))
            {
                if (!Directory.Exists(teSourceFolder.Text))
                {
                    teSourceFolder.Focus();
                }
                else
                {
                    teDestinationFolder.Focus();
                }

                return;
            }

            Boolean error = false;
            foreach (DataGridViewRow row in dgv.Rows)
            {
                if (row.Cells[0].Value.ToString() == "Ordner" && row.Cells[1].Value.ToString() == teSourceFolder.Text && row.Cells[2].Value.ToString() == teDestinationFolder.Text)
                {
                    error = true;
                }
            }

            if (!error)
            {
                var dr = _dt.NewRow();
                dr["Art"] = "Ordner";
                dr["Quelle"] = teSourceFolder.Text;
                dr["Ziel"] = teDestinationFolder.Text;
                dr["Timer"] = teTimerFolder.Text;
                dr["Kompression"] = teMaxZipFolder.Value;

                _dt.Rows.Add(dr);
                dgv.DataSource = _dt;
            }
        }

        private void BtnSourceFileClick(object sender, EventArgs e)
        {
            var source = new OpenFileDialog();
            if (source.ShowDialog() == DialogResult.OK)
            {
                teSourceFile.Text = source.FileName;
            }

            if (teSourceFile.Text == String.Empty || !File.Exists(teSourceFile.Text))
            {
                MessageBox.Show(@"Quell Datei ist nicht gefüllt oder nicht existent", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                teSourceFile.Focus();
                return;
            }
        }

        private void BtnDestinationFileClick(object sender, EventArgs e)
        {
            var destination = new FolderBrowserDialog();
            if (destination.ShowDialog() == DialogResult.OK)
            {
                teDestinationFile.Text = destination.SelectedPath;
            }

            if (teDestinationFile.Text == String.Empty || !Directory.Exists(teDestinationFile.Text))
            {
                MessageBox.Show(@"Ziel Ordner ist nicht gefüllt oder nicht existent", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                teDestinationFile.Focus();
                return;
            }
        }

        private void BtnInsertFileClick(object sender, EventArgs e)
        {
            if (!File.Exists(teSourceFile.Text) || !Directory.Exists(teDestinationFile.Text))
            {
                if (!File.Exists(teSourceFile.Text))
                {
                    teSourceFile.Focus();
                }
                else
                {
                    teDestinationFile.Focus();
                }

                return;
            }

            Boolean error = false;
            foreach (DataGridViewRow row in dgv.Rows)
            {
                if (row.Cells[0].Value.ToString() == "Datei" && row.Cells[1].Value.ToString() == teSourceFile.Text && row.Cells[2].Value.ToString() == teDestinationFile.Text)
                {
                    error = true;
                }
            }

            if (!error)
            {
                var dr = _dt.NewRow();
                dr["Art"] = "Datei";
                dr["Quelle"] = teSourceFile.Text;
                dr["Ziel"] = teDestinationFile.Text;
                dr["Timer"] = teTimerFile.Text;
                dr["Kompression"] = teMaxZipFile.Value;

                _dt.Rows.Add(dr);
                dgv.DataSource = _dt;
            }
        }

        private void BtnStartClick(object sender, EventArgs e)
        {
            if (dgv.Rows.Count != 0)
            {
                foreach (DataRow row in _dt.Rows)
                {
                    if (row[0].ToString() == "Ordner")
                    {

                    }
                    else if (row[0].ToString() == "Datei")
                    {

                    }
                }
            }
            else
            {
                MessageBox.Show(@"Es wurden keine Daten angegeben", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (dgv.Rows.Count != 0)
            {
                DataSet exportDataSet = new DataSet();
                exportDataSet.Tables.Add(_dt.Clone());

                exportDataSet.WriteXml(String.Format("{0}\\{1}", Application.StartupPath, "data.xml"), System.Data.XmlWriteMode.IgnoreSchema);
            }
        }

        private void teMaxZipFolder_EditValueChanged(object sender, EventArgs e)
        {
            lblValueMaxZipFolder.Text = teMaxZipFolder.Value.ToString();
        }

        private void teMaxZipFile_EditValueChanged(object sender, EventArgs e)
        {
            lblValueMaxZipFile.Text = teMaxZipFile.Value.ToString();
        }
    }
}

3.430 Beiträge seit 2007
vor 11 Jahren

Hallo,

das Problem ist vermutlich dass du beim Import der Daten die Datei nicht mehr freigegeben hast.

Versuch mal den XmlReader zu Disposen nachdem die Daten in das DataSet geladen wurden_** importReader.Dispose();**_

PS: Bitte nicht den gesamten Code anhängen sondern nur den relevanten Teil. Somit müssten wir uns nicht durch den ganzen Code wühlen um das Problem zu lokalisieren

Grüße
Michael

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo mrennen,

ergänzend zu Michaels Antwort.

die entsprechende Methode jedoch schon lange wieder verlassen habe...

Wenns nicht explizit geschlossen wird, so erfolgt das erst wenn der Finalizer tätig wird und das ist eben nicht absehbar. Daher sollte Dispose/Close explizt aufgerufen werden wo es zur Verfügung steht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
mrennen Themenstarter:in
166 Beiträge seit 2008
vor 11 Jahren

Schon einmal danke

Beim Versuch den XmlReader zu disposen bekomme ich:

Fehlermeldung:
System.Xml.XmlReader.Dispose(bool)" ist aufgrund der Sicherheitsebene nicht möglich.

Ich bin Admin auf der Kiste hier und es gibt keine Domain oder so...

Versucht habe ich es über: importReader.Dispose();

M
mrennen Themenstarter:in
166 Beiträge seit 2008
vor 11 Jahren
Erledigt

Erledigt - DANKE @gfoidl

Ich habe weiter experimentiert

mit importReader.Close(); funktioniert es nun 😃

Danke und Gruß aus Duisburg

Michael