MMazi Geschrieben 4. November 2020 Geschrieben 4. November 2020 gibt es eine Vorgehensweise einen Ordnerpfad in der Code so definieren, dass an jedem Rechner ohne Fehlermeldung funktioniert? Zitieren
0 Rienne Geschrieben 5. November 2020 Geschrieben 5. November 2020 (bearbeitet) vor 24 Minuten schrieb MMazi: Aber Ich wüsste nicht wie ich diesen Code in der Stelle von Code einsetze wo der Absolute Pfad steht Also soweit ich mich noch an C# erinnere, müsste doch Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) einen String zurückgeben, oder? D.h. du musst lediglich die Stelle string testtext = "C:/Users/mmohammadi/Documents/Zeitbuchung_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt"; anpassen und ersetzen durch string testtext = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt"; P.S.: an solchen Stellen solltest du übrigens im Idealfall noch mögliche Fehler abfangen und behandeln. Bearbeitet 5. November 2020 von Rienne Zitieren
0 Maniska Geschrieben 4. November 2020 Geschrieben 4. November 2020 Solange der Ordnerpfad Leerzeichen oder noch schlimmer Umlaute enthält, kann es immer zu Problemen kommen. Disclaimer: Die Ausführlichkeit meiner Antwort steh im Zusammenhang mit der Ausführlichkeit der Frage Zitieren
0 pr0gg3r Geschrieben 4. November 2020 Geschrieben 4. November 2020 vor 28 Minuten schrieb Maniska: Disclaimer: Die Ausführlichkeit meiner Antwort steh im Zusammenhang mit der Ausführlichkeit der Frage Ich rate auch mal ins blaue und werfe die Stichworte "absoluter Pfad" und "relativer Pfad" in den Raum. Ob er was damit anfangen kann, keine Ahnung... Zitieren
0 allesweg Geschrieben 5. November 2020 Geschrieben 5. November 2020 Leerzeichen und fast alle Sonderzeichen machen Probleme. Oft empfiehlt sich die Verwendung von Umgebungsvariablen. Zitieren
0 MMazi Geschrieben 5. November 2020 Autor Geschrieben 5. November 2020 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. 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> Zitieren
0 thereisnospace Geschrieben 5. November 2020 Geschrieben 5. November 2020 Und warum genau funktioniert kein relativer Pfad zur Anwendung, der innerhalb des Working Paths eine Folder erstellt, in der die Text Datei abgelegt wird? JustALurker reagierte darauf 1 Zitieren
0 allesweg Geschrieben 5. November 2020 Geschrieben 5. November 2020 Entweder relativ ins Anwendungsverzeichnis legen oder aber das OS abfragen und je nach OS-Familie die Umgebungsvariable des Profilordners verwenden? JustALurker reagierte darauf 1 Zitieren
0 MMazi Geschrieben 5. November 2020 Autor Geschrieben 5. November 2020 (bearbeitet) mit dem Relativen Pfad geht auch Aber anscheinend it 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? Bearbeitet 5. November 2020 von MMazi Zitieren
0 KeeperOfCoffee Geschrieben 5. November 2020 Geschrieben 5. November 2020 (bearbeitet) Nutzt du .NET Core? Packst du zu einer .exe (ist eine Option unter Veröffentlichung)? Wenn ja so werden deine .NET Dateien im Temp Order normalerweise irgendwo entpackt und ausgeführt. Dies führt dazu, dass das ganze Zeug mit den Pfaden oft schief läuft. Den aktuellen Pfad zu deiner .exe bekommst du durch System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName ich hohle mir den originalen Ausführungspfad meistens durch string codeBase = Assembly.GetExecutingAssembly().CodeBase; UriBuilder uri = new UriBuilder(codeBase); string path = Uri.UnescapeDataString(uri.Path); return Path.GetDirectoryName(path); Bearbeitet 5. November 2020 von KeeperOfCoffee Zitieren
0 allesweg Geschrieben 5. November 2020 Geschrieben 5. November 2020 Windows-only? %USERPROFILE% Zitieren
0 MMazi Geschrieben 5. November 2020 Autor Geschrieben 5. November 2020 Ich danke euch für ausfürliche Antworten, Ich habe it hilfe meinem Ausbilder diesen code geschrieben und macht dann was er soll: der speichert in My Document ,einschliesslich musste man noch dazu "/Zeitbuchung_" hinufügen : string testtext = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/Zeitbuchung_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt"; var objWriter = new System.IO.StreamWriter(testtext); Zitieren
0 pr0gg3r Geschrieben 5. November 2020 Geschrieben 5. November 2020 vor 21 Minuten schrieb MMazi: Ich danke euch für ausfürliche Antworten, Ich habe it hilfe meinem Ausbilder diesen code geschrieben und macht dann was er soll: der speichert in My Document ,einschliesslich musste man noch dazu "/Zeitbuchung_" hinufügen : string testtext = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/Zeitbuchung_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt"; var objWriter = new System.IO.StreamWriter(testtext); Also mich macht sowas ja immer ein wenig sauer... Das ist genau das, was @Rienne geschrieben hat. Hast du das überhaupt gelesen? Und wieso fragst du hier - wenn du eh nicht drauf hörst - und nicht gleich deinen Ausbilder? Zitieren
0 MMazi Geschrieben 5. November 2020 Autor Geschrieben 5. November 2020 @pr0gg3rIch habe doch sein Antwort genommen , nun musste man noch da noch was ändern Ich habe alle Antworten gelesen und verglichen Zitieren
0 MartinSt Geschrieben 5. November 2020 Geschrieben 5. November 2020 @MMazi Um die Eingangsfrage zu beantworten, so allgemein wie sie formuliert ist : NEIN. Und was die Kollegen hier meinen ist, du sollst lesen, nachdenken und verstehen. Neben den schon genannten Leer- und Sonderzeichen, hast du auch zu bedenken, dass immer auch die Schreibrechte aufs Verzeichnis in Frage stehen. Jedes OS und viele User haben strikte Regeln wo Logs, Protokolle u.ä. liegen und ein Programm dass wild auf meiner Platte Dateien erzeugt, fliegt in 10sec wieder runter. Also: Gibt dem Anwender die Chance zu konfigurieren, wo die Dateien hin sollen und schlag ihm dafür ein für sein OS typisches Verzeichnis vor. MMazi und Thanks-and-Goodbye reagierten darauf 1 1 Zitieren
0 Maniska Geschrieben 5. November 2020 Geschrieben 5. November 2020 vor 3 Stunden schrieb MartinSt: Gibt dem Anwender die Chance zu konfigurieren, wo die Dateien hin sollen und schlag ihm dafür ein für sein OS typisches Verzeichnis vor. This! Ich entscheide wer wo auf meiner Platte Zeugs ablegt, entweder indem ich es einstellen kann, oder indem ich ein Programm wähle bei dem ich es einstellen kann. MMazi reagierte darauf 1 Zitieren
Frage
MMazi
gibt es eine Vorgehensweise einen Ordnerpfad in der Code so definieren, dass an jedem Rechner ohne Fehlermeldung funktioniert?
15 Antworten auf diese Frage
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.