Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Automatisch generierte Pfad
MMazi
myCSharp.de - Member



Dabei seit:
Beiträge: 47

Themenstarter:

Automatisch generierte Pfad

beantworten | zitieren | melden

gibt es eine Vorgehensweise einen Ordnerpfad in der Code so definieren, dass an jedem Rechner ohne Fehlermeldung funktioniert ?
private Nachricht | Beiträge des Benutzers
HansFred
myCSharp.de - Member



Dabei seit:
Beiträge: 49

beantworten | zitieren | melden

Erklär mal was das problem ist auf das du gestossen bist
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4191

beantworten | zitieren | melden

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).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
MMazi
myCSharp.de - Member



Dabei seit:
Beiträge: 47

Themenstarter:

beantworten | zitieren | melden

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>
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MMazi am .
Attachments
private Nachricht | Beiträge des Benutzers
HansFred
myCSharp.de - Member



Dabei seit:
Beiträge: 49

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
MMazi
myCSharp.de - Member



Dabei seit:
Beiträge: 47

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MMazi am .
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 254
Herkunft: Oberhausen (NRW)

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Alf Ator
myCSharp.de - Member



Dabei seit:
Beiträge: 639

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Alf Ator am .
private Nachricht | Beiträge des Benutzers
MMazi
myCSharp.de - Member



Dabei seit:
Beiträge: 47

Themenstarter:

beantworten | zitieren | melden

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..
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 403
Herkunft: Kassel

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers