[C#] Ordner überwachen und Datei verschieben

Ageoffall

Cadet 4th Year
Registriert
Apr. 2011
Beiträge
79
Hallo,

ich hatte heute eine spontane Idee: Ein Programm welches einen Ordner überwacht und wenn eine Datei mit der Endung ".mp3" hat, die Datei verschieben.
Ich bin allerdings nicht wirklich gut, was das programmieren angeht und habe jetzt zumindest mal angefangen komme aber nicht weiter. Ich hoffe, ich ihr versteht mich :D
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Security.Permissions;


namespace Musik
{
    class Program
    {
        [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]

        static void Main(string[] args)
        {


            FileSystemWatcher FSW;

            FSW = new FileSystemWatcher();
            FSW.Path = @"C:\Users\Julian\Downloads";
            FSW.Filter = "*.mp3";
            FSW.Changed += new FileSystemEventHandler(OnChanged);
            FSW.IncludeSubdirectories = true;
            FSW.EnableRaisingEvents = true;
        }
             private static void OnChanged(object source, FileSystemEventArgs e)
    {

        File.Move("C:\\Users\\Julian\\Downloads\\*.mp3", "E:\\Musik");

        }

    }

}

Danke euch!
 
Was funktioniert denn eigentlich nicht?


Code:
File.Move("C:\\Users\\Julian\\Downloads\\*.mp3", "E:\\Musik");
Bist du sicher, dass das so geht? Man muss doch hier eine konkrete Datei angeben.
 
Naja, ich kann das Programm nicht dauerhaft ausführen, dass sollte es jedoch tun, damit er die Dateien immer verschieben könnte.

Ich hatte eigentlich erhofft, dass er einen * Parameter annimmt, sodass der Dateiname egal ist.
 
Hi,

laut Doku

Code:
public static void Move(
	string sourceFileName,
	string destFileName
)

Also konkrete Dateien.

Du hast zwei Möglichkeiten: entweder als Dienst, der dauerhaft läuft, oder per Cron gestartet alle X Minuten. Und dann für jede Datei separat das Verschieben durchführen.

VG,
Mad
 
Danke erstmal für eure Antworten.

Dann frage ich einfach mal anders: Kann ich es irgendwie einrichten, dass dem Programm/Prozess/Corn die Endung reicht? Sonst ist die Idee glaub ich nicht so gut :D.
 
Hi,

wieso denn nicht? Das Event wird doch für jede Datei einzeln geworfen! "e.FullPath" im EventHandler liefert dir doch genau den Dateinamen. Wo ist denn das Problem?

VG,
Mad
 
Ich glaube ich steh total auf dem Schlauch: Der Dateiname ist immer variabel, also müsste ich diesen doch immer neu angeben, oder nicht?

Sorry wenn ich mich wirklich dumm anstelle
 
Sicher reicht die Änderung, wenn du den Inhalt des Verzeichnis komplett erfasst und nur die Datei mit den passenden Endungen herausfilterst. Dann hast du auch gleich die konkreten Dateinamen fürs Verschieben.
 
Hi,

anstelle deines

Code:
"C:\\Users\\Julian\\Downloads\\*.mp3"

Benutzt du eben

Code:
e.FullPath

um den Quellpfad anzugeben. Wenn die Datei im neuen Ordner genauso heißen soll musst du eben noch den Dateinamen alleine ohne den restlichen Pfad nehmen und in an deinen Zielordner hängen.

VG,
Mad
 
Ich habe den FullPath angepasst. Ich verstehe es dennoch irgendwie nicht, bzw. tut sich auch nicht wirklich was. Wie würde ich denn einen Dienst daraus machen?


Danke!
 
Ein Problem nach dem anderen. Erst mal muss das Verschieben funktionieren.
Was konkret geht da schief?
 
Wenn ich das nun richtig verstanden habe:
Das Programm muss laufen, damit der Ordner dauerhaft gechecked wird ob eine Datei mit der Endung .mp3 in den Ordner geschrieben, bzw. geschoben wird. Und wenn dies der Fall ist soll der die Datei verschieben. Wenn ich das Programm nun starte und eine Datei in den Ordner schiebe oder schreibe passiert einfach nichts.
 
So wie ich das sehe, beendet sich das Programm sofort. Es hat gar keine Chance, auf ein Event zu reagieren.
 
Jetzt kam mir spotan das ich ein break einbauen sollte? Ich weiß nicht O.o
 
Sry, wenn ich das jetzt so direkt sage, aber verschiebe dein Projekt und lern erst mal Programmieren. Es habe keine Lust, den ganzen Urschleim rauszuholen.
 
Ich sollte nun evtl. nicht erwähnen das ich eine Ausbildung in der IT mache O.o

Ich danke dir dennoch für deine Hilfe :).
 
Hi,

mach folgendes: mach ein Windows-Forms-Programm draus und lege die Funktionalität auf einen Button bzw. dessen Klick-Event, dann kannst du es gezielt starten und stoppen.

Das "Change" Event ist übrigens nicht geeignet, wenn du Dateien neu anlegst oder schreibst, das feuert nur bei Änderungen an bestehenden Dateien! Richtiges Event raussuchen! Zumindest, wenn ich das noch richtig im Kopf habe.

VG,
Mad
 
Ich würde das Programm nicht auf einem Event aufbauen. Schreib das Programm doch einfach so, dass es, wenn es startet, kurz deinen Ordner auf mp3-Dateien durchsucht. Wenn es welche findet, kopier die Datein mit ner schönen Schleife rüber.

Dann kannst du das Programm mit nem Cronjob regelmäßig ausführen lassen und fertig.
Oder wenn du es ständig laufen lassen willst, dann mach die ne while-Schleife, die immer true ist und mach dir nen wait-Kommand zwischen rein.
 
@Merion: Die FileSystemWatcher-Klasse ist doch genau für solche Sachen da. Warum dann nicht auch nutzen?
 
Zurück
Oben