Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Gelöst von Rienne

Zur Lösung
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...

  • Gast hat den Titel geändert in Ordnerpfad definieren
  • Autor

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>

 

Projektmappe.PNG

ZET.PNG

  • Autor

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 von MMazi

  • Lösung
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 von Rienne

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 von KeeperOfCoffee

  • Autor

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);

 

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?

 

@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.

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.