Laden...

Automatisch generierte Pfad

Erstellt von MMazi vor 3 Jahren Letzter Beitrag vor 3 Jahren 708 Views
M
MMazi Themenstarter:in
45 Beiträge seit 2020
vor 3 Jahren
Automatisch generierte Pfad

gibt es eine Vorgehensweise einen Ordnerpfad in der Code so definieren, dass an jedem Rechner ohne Fehlermeldung funktioniert ?

H
48 Beiträge seit 2020
vor 3 Jahren

Erklär mal was das problem ist auf das du gestossen bist

4.938 Beiträge seit 2008
vor 3 Jahren

Hallo,

du meinst hard-gecodete Pfade wie z.B. "C:\Users\UserName\Dokumente\Test.txt"?

Du solltest daher niemals hard-gecodete (absolute) Pfade verwenden, sondern entweder relative Pfade (als Unterpfade zu deiner Anwendung), über Konfigurationseinstellungen oder mittels Abfrage der OS-Pfade des Anwenders (z.B. mittels Environment.GetFolderPath).
Und Pfade im Programm dann immer mittels Path.Combine zusammensetzen!

Edit: Application.StartupPath ist auch noch nützlich (um relative Pfade in absolute umzuwandeln).

M
MMazi Themenstarter:in
45 Beiträge seit 2020
vor 3 Jahren

Hallo, Danke für die Antworten, beschreibe hier halt nun mal die Problematik :

Ich habe ein Zeiterfassungstool geschrieben ,das Tool ist einfach gehalten es erfasst halt nur die Aktuelle Datum und Start und Ende und speichert diese Daten in eine Text datei auf eigene Lokle Ordner.

Nun Der Pfad müsste insoweit so geändert werden, dass in jedem beliebigen Rechner in einen bestimmten Ordner die erstellte Textdatei gespeichert wird.

mit absoluter und Relativer Pfad wurde wharscheilich nicht lösbar sein sondern eher mit einer Umgebungvariablen wie %Appdata% oder %Temp% oder ähnliches, als Zieldatei sollte in dieses Pfadziel einen Ordner automatisch erstellt werden , in dem die Textdatei die jedes mal mit drücken auf speichern gestellt und erfasst werden , gespeichert wird.

Danke TH69 ,bin dabei die Lösungen von dir zu probieren bzw anzuwenden.

ich danke euch in voraus für die Antworten

Hier der Code:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;

namespace Zeiterfassungstool
{
    public partial class Form1 : Form
    {
        //Globale Variabeln

        public DateTime startTime;
        public DateTime endTime;


        string v1 = System.Configuration.ConfigurationManager.AppSettings["k1"];
        string v2 = System.Configuration.ConfigurationManager.AppSettings["k2"];
        string v3 = System.Configuration.ConfigurationManager.AppSettings["k3"];
        
        public Form1()
        {
            InitializeComponent();

            btnStart.Visible = true;
            //btnEnde.Visible = false;
            //btnspeichern.Visible = false;
            btnStart.Text = "Start";

            MessageBox.Show(System.Configuration.ConfigurationManager.AppSettings["k1"]);
            MessageBox.Show(System.Configuration.ConfigurationManager.AppSettings["k2"]);
            MessageBox.Show(System.Configuration.ConfigurationManager.AppSettings["k3"]);
        }
        //--------------------------------------START------------------------------------------------
        private void btnStart_Click(object sender, EventArgs e)
        {
            if (btnStart.Text == "Start")
            {
                this.startTime = DateTime.Now;
                textBox2.Text = startTime.ToString("HH:mm:ss");
                int n = dataGridView1.Rows.Add();
                dataGridView1.Rows[n].Cells[0].Value = textBox2.Text;
                btnStart.Text = "Ende";
            }
            else
            {
                this.endTime = DateTime.Now;
                textBox3.Text = endTime.ToString("HH:mm:ss");
                int n = dataGridView1.Rows.Count - 1;
                dataGridView1.Rows[n].Cells[1].Value = textBox3.Text;
                TimeSpan dauer;
                dauer = endTime.Subtract(startTime);
                int m = dataGridView1.Rows.Count - 1;
                dataGridView1.Rows[m].Cells[2].Value = dauer.TotalHours.ToString("0.00");
                Bemerkung bemerkungdialog = new Bemerkung();
                bemerkungdialog.StartPosition = FormStartPosition.CenterScreen;


                if (bemerkungdialog.ShowDialog() == DialogResult.OK)
                {
                    int d = dataGridView1.Rows.Count - 1;
                    dataGridView1.Rows[d].Cells[3].Value = bemerkungdialog.getBemerkung();
                }
            //----------Löschen-------------------
                foreach (Control tbx in Controls)
                {
                    if (tbx.GetType() == typeof(TextBox))
                    {
                        ((TextBox)tbx).Clear();
                    }
                }
                btnStart.Text = "Start";
            }
        }
        //------------------------------------SizeChanged. NotifyIcon-------------------------------------------
        private void Form1_SizeChanged(object sender, EventArgs e)
        {

            if (this.WindowState == FormWindowState.Minimized)
            {
                notifyIcon1.Icon = SystemIcons.Application;
            }
             this.ShowInTaskbar = false;
        }   
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.WindowState = FormWindowState.Normal;
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
 if (MessageBox.Show("Speichern?","Zeiterfassungstool", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
              string testtext = "C:/Users/mmohammadi/Documents/Zeitbuchung_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
              var objWriter = new System.IO.StreamWriter(testtext);
              int count = dataGridView1.Rows.Count;
              for (int row = 0; row < count; row++)
                {
                    int columncount = dataGridView1.Columns.Count;
                    for (int column = 0; column < columncount; column++)
                {
                        objWriter.WriteLine(dataGridView1.Rows[row].Cells[column].Value.ToString());
                    }
                }
                MessageBox.Show("Text file was created.");
                objWriter.Close();
            }
            DialogResult dialog = MessageBox.Show("möchten Das Programm wirklich beenden?");
            if (dialog == DialogResult.Yes)
            {
                Application.Exit();
            }
            else if(dialog == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
    }
}

App.Config:


<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <appSettings>
    <add key="k1" value="Pfad zum Speichern angeben " />
    <add key="k2" value="v2" />
    <add key="k3" value="v3" />
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
  
</configuration>

H
48 Beiträge seit 2020
vor 3 Jahren

Es gibt regeln welche daten in welchen ordnern abgelegt werden sollen. in deinem fall ist es die programdata aus Environment.SpecialFolder. dort ist es übrlich das man einen ordner mit dem firmenname erstellt, dann mit dem produktname und darin dann dateien ablegt.

M
MMazi Themenstarter:in
45 Beiträge seit 2020
vor 3 Jahren

stimmt mit dem Relativen Pfad geht auch Aber anscheinend ist Besser mit :


Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Aber Ich wüsste nicht wie ich diesen Code in der Stelle von Code einsetze wo der Absolute Pfad steht :


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
 if (MessageBox.Show("Speichern?","Zeiterfassungstool", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                //e.Cancel = true;
              // hier wird bei Ja gespeichert

                string testtext = "C:/Users/mmohammadi/Documents/Zeitbuchung_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
                
                var objWriter = new System.IO.StreamWriter(testtext);

                int count = dataGridView1.Rows.Count;


                for (int row = 0; row < count; row++)
                {
                    int columncount = dataGridView1.Columns.Count;
                    for (int column = 0; column < columncount; column++)

                    {
                        objWriter.WriteLine(dataGridView1.Rows[row].Cells[column].Value.ToString());
                    }
                }
                MessageBox.Show("Text file was created.");
                objWriter.Close();
            }
            DialogResult dialog = MessageBox.Show("möchten Das Programm wirklich beenden?");
            if (dialog == DialogResult.Yes)
            {
                Application.Exit();
            }
            else if(dialog == DialogResult.No)
            {
                e.Cancel = true;
            }

habt Ihr vieleicht eine Idee?

J
251 Beiträge seit 2012
vor 3 Jahren

In dem man den relativen Part integriert und den absoluten entfernt.

Dazu verwendet man zusätzlich die Kombinationsoption, welcher Th69 schon erwähnt hat, um einen vollstandigen Dateinamen zu bauen.

A
764 Beiträge seit 2007
vor 3 Jahren

Hier mal händisch runtergeschrieben:


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
	var dialogResult = MessageBox.Show("Speichern?","Zeiterfassungstool", MessageBoxButtons.YesNoCancel);

	switch (dialogResult)
	{
		case DialogResult.Yes:
		{
			SaveData();
			// Application wird nach dem Speichern beendet
		}
		case DialogResult.No:
		{
			// Application ohne speichern beenden
		}
		case DialogResult.Cancel:
		{
			// Application doch nicht schließen
			e.Cancel = true;
		}
	}
}

private void SaveData()
{
	var myDocumentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
	var fileName = $"Zeitbuchung_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.txt";
	var fullFilePath = Path.Combine(myDocumentsPath, fileName);
	
	var stringBuilder = new StringBuilder();
	foreach (var row in dataGridView1.Rows)
	{
		foreach(var column in row.Columns)
		{
			stringBuilder.Write(column.Value);
		}
		stringBuilder.WriteLine();
	}
	File.Write(fullFilePath, stringBuilder.ToString());
}

Edit:
Bitte auch beachten, was die anderen geschrieben haben.

M
MMazi Themenstarter:in
45 Beiträge seit 2020
vor 3 Jahren

Danke Alf Ator für die Antwort, Ich habe ja endeffekt der Code so geschrieben:


 string testtext = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/Zeitbuchung_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
                
               
                var objWriter = new System.IO.StreamWriter(testtext);

werde aber aufjeden fall mit deinem Code versuchen, sieht Effektiver aus..

P
441 Beiträge seit 2014
vor 3 Jahren

Als Tipp: Nutze die Methode Combine der Klasse Path um Pfadteile zu verbinden.

Zum einen ist sie extra dafür gemacht, zum hilft sie dir bei Änderungen. Falls du z.B. einmal auf Linux lauffähig sein musst.