Laden...

Dateien nach Dateiendung filtern und verarbeiten Console

Erstellt von gh0striderBB vor 9 Jahren Letzter Beitrag vor 9 Jahren 4.241 Views
G
gh0striderBB Themenstarter:in
6 Beiträge seit 2015
vor 9 Jahren
Dateien nach Dateiendung filtern und verarbeiten Console

Hallo Zusammen,

ich bin gerade dabei ein Programm zu schreiben das einen Bestimmten Ordner nach .pst Dateien durchsucht, und diese mir in einem Array ausgibt. Soweit alles gut.

Jetzt kommen wir aber auch schon zum Knackpunkt.

Ich möchte die Inhalte aus dem Array ausgeben, der User soll eine Datei auswählen und diese soll dann auf einen USB STick kopiert werden.

Das kopieren funktioniert, das ist nicht das Problem aber ich kann nicht auf die einzelnen Array Inhalte zugreifen.

Die Ausgabe sollte wie folgt aussehen:

Welche Datei soll kopiert werden?
1: PST1
2: PST2
...

Dann gibt der Benutzer die Zahl ein und das ganze wird kopiert.
Aber ich kann nicht richtig auf das Array zugreifen.


Console.WriteLine("Welche Datei soll kopiert werden");
                    
                				
	string[] files = Directory.GetFiles(@"C:\Users\" + user + "\Desktop");
        foreach(string file in files)
            {
                if(file.ToLower().EndsWith(".pst"))
                {
                     Console.WriteLine(file);
                    
                }
                	
                
            	}
            	
                outlook_profile_number = Convert.ToInt32(Console.ReadLine());
               	Console.WriteLine(@"Folgende Datei wurde ausgewählt C:\Users\" + user + "\Desktop" + files[outlook_profile_number]);
                //Danach soll der Kopier befehl gestartet werden, den habe ich auch und der funktioniert ohne Probleme

Könnt ihr mir evtl sagen wo das Problem ist ich werde aus Google einfach nicht schlauer -.-

Viele Grüße gh0striderBB

2.298 Beiträge seit 2010
vor 9 Jahren

Was kommt denn für ein Fehler? Grob beim Überblicken sehe ich keinen Fehler.

Den sehe ich eher da wo du deinen String zusammen stückelst. Du musst bei allen Teilstrings wie beim ersten ein @ voranstellen.

Beim auslesen des Arrays musst du auch darauf achten, dass ein Array bei Index 0 anfängt. Wenn Datei 1 mittels "1" auszuwählen ist musst du also auf das Array mit dem Wert der Eingabe - 1 zugreifen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

G
gh0striderBB Themenstarter:in
6 Beiträge seit 2015
vor 9 Jahren

Das Problem ist das ich nicht über die eingabe nur auf das Array zugreifen kann sondern das er mir auf alle Dateien vom Desktop zugreift

2.298 Beiträge seit 2010
vor 9 Jahren

Dann liegt dein Problem aber nicht beim Array sondern beim String allgemein. - Was heißt auf alle Dateien?

  • Ah!! - Jetzt sehe ich wo es bei dir hängt. - Wenn du den 2. Parameter von Directory.GetFiles mit "*.pst" belegst, sollte das Array anschließend nur solche Dateien enthalten.

Allerdings solltest du dir wegen dem Pfad noch mal Gedanken machen. - Ich würd dir was in der Richtung vorschlagen:


string sPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

Damit ersparst du dir das String gepfusche. Für den Zugriff auf die Datei arbeitest du dann am besten mit Path.Combine siehe:


sFileToCopy = Path.Combine(sPath, files[outlook_profile_number]);

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

R
228 Beiträge seit 2013
vor 9 Jahren

Ich kann dir nicht ganz folgen aber Debugge einfach mal das Programm und guck was in dem Array ist, überprüfe deinen Index usw. Dann solltest du recht schnell auf das Problem stoßen. Pfade am besten per Path.Combine zusammen setzen

G
gh0striderBB Themenstarter:in
6 Beiträge seit 2015
vor 9 Jahren

Das mit dem Desktop war nur ein Beispiel, weil standardmäßig liegen die .Pst Archive von Outlook ja unter AppData/Local/Microsoft/Outlook

Allerdings komm ich mit dem einbau in meine Syntax noch nicht so ganz klar? HabNurAnfängerWissen
Ich steh grad echt voll im Wald. Könnt ihr mir einen kleinen Denkanstoß geben?

16.842 Beiträge seit 2008
vor 9 Jahren

inflames2k hat Dir doch schon den ausschlaggebenden Hinweis gegeben. Was brauchst noch?

G
gh0striderBB Themenstarter:in
6 Beiträge seit 2015
vor 9 Jahren

Wie ich das ganze jetzt in meinen Code einbauen muss. Ich hab es an unterschiedlichen Stellen versucht aber hat zu keinem Erfolg geführt

Die folgende Code Zeile hat doch die Funktion, das er den Ordnerpfad angibt wo gesucht werden soll oder?


string sPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

Das ist ja dann die Ausgabe auf die der User Antworten muss oder?


sFileToCopy = Path.Combine(sPath, files[outlook_profile_number]);

Und wenn ich das dann so gemäß meinem Verständniss in den Code einbaue hab ich die selbe Funktion wie ich schon davor hatte. (Ich habe eine .json Datei auf dem Desktop liegen und 3 .pst Dateien.

Meine Ausgabe die ich bekomm:
Er Zeigt mir 3 .pst Dateien an wenn ich aber auf 1 Drücke gibt er mir den Name von meiner JSON Datei aus.

Hier mein geänderter Code


Console.WriteLine("Welche Datei soll kopiert werden");
 				
	string[] files = Directory.GetFiles(@"C:\Users\" + user + @"\Desktop");
	string sPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            	foreach(string file in files)
            	{
                	if(file.ToLower().EndsWith(".pst"))
                	{
                    	//Verarbeitung
                    	Console.WriteLine(file);
                    
               	}
                	
                
            	}
            	
                outlook_profile_number = Convert.ToInt32(Console.ReadLine());
                string sFileToCopy = Path.Combine(sPath, files[outlook_profile_number]);
               	Console.WriteLine(sFileToCopy);
                //Danach soll der Kopier befehl gestartet werden, den habe ich auch und der funktioniert ohne Probleme
                    	
                    
            Console.ReadKey();

R
228 Beiträge seit 2013
vor 9 Jahren

Ist doch klar


string[] files = Directory.GetFiles(@"C:\Users\" + user + @"\Desktop");

gibt die alle Dateien auf dem Desktop.

Durch


 if(file.ToLower().EndsWith(".pst"))
                    {
                        //Verarbeitung
                        Console.WriteLine(file);

                   }

werden nur die Dateien ausgeben, die du haben möchtest.


files[outlook_profile_number]

hier greifst du aber wieder auf das Array mit allen Dateien zu.

Sinnvoll wäre es vorher schon so zu Filtern, dass in deinem Array nur die Dateien sind, die du tatsächlich brauchst.

189 Beiträge seit 2014
vor 9 Jahren

Du hast nur die Hälfte von inflames2k's Hinweisen glesen:

  • Ah!! - Jetzt sehe ich wo es bei dir hängt. - Wenn du den 2. Parameter von Directory.GetFiles mit "*.pst" belegst, sollte das Array anschließend nur solche Dateien enthalten.
2.298 Beiträge seit 2010
vor 9 Jahren

Hallo gh0striderBB,

da du ja scheinbar nicht selbst dahinter kommst:


// Ordnerpfad für Desktop ermitteln
string sPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

// alle *.pst-Dateien aus dem Pfad ermitteln
// Betonung liegt auf der Dateiendung und dem von mir genannten 2. Parameter!
string[] files = Directory.GetFiles(sPath, "*.pst");

Gibst du den 2. Parameter nicht mit an, werden natürlich alle Dateien auf dem Desktop in das Array gepackt. - Und die verschwinden auch nicht durch Magie nur weil du sie nicht für die Auswahl mit ausgibst.

Ein netter Nebeneffekt ist, dass du deine Prüfung auf die Dateiendung damit auch weglassen kannst.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

G
gh0striderBB Themenstarter:in
6 Beiträge seit 2015
vor 9 Jahren

Achso ja klar das hab ich übersehen
*kopfgegenwandhau*

Das funktioniert jetzt (Y)

Wenn ihr mir jetzt noch einen kleinen Tip habt:

Wie kann ich vor die ausgabe noch eine Zahl setzen. Aktuell wird einfach nur der Datei Name ausgegeben.
PST1
PST2
PST3

Ich hätte aber gerne die ausgabe wie folgt:

1: PST1
2: PST2
3: PST3

R
228 Beiträge seit 2013
vor 9 Jahren

Zum Beispiel so:


int i = 0;

foreach(string file in files)
{    
        //Verarbeitung
       Console.WriteLine(i + ": " + file);
       i++;
}


G
gh0striderBB Themenstarter:in
6 Beiträge seit 2015
vor 9 Jahren

Super Perfekt für eure Hilfe jetzt funktioniert alles (Y)
1000. Dank

189 Beiträge seit 2014
vor 9 Jahren

Mit Stringverkettung, String.Format() oder Stringbuilder.
Siehe dazu auch [Artikel] Strings verketten: Performance-Betrachtung.
Das sind aber grundlegendste Grundlagen, die du einfach durch ein Buch lernen musst!
Wenn du mit Dateien rumpfuschst, aber das nicht weißt, machst du was beim Erlernen der Sprache falsch!