Batch Batch Datei zum Ordner erstellen

nexalaxy

Herzlich willkommen!
Hallo,
wenn ich z.B. über Tubebox ein neues Lied herunterlade, wird es ja immer im Ordner C:\Users\**username**\Documents\TubeBox gespeichert.
Das wird aber mit der Zeit immer unübersichtlicher.
Deshalb möchte ich eine .batch Datei programmieren, die erkennt, wenn eine neue Datei in den Ordner verschoben wird, dann einen neuen Ordner nach dem aktuellen Datum benennt, z.B. 2013_03_23 und dann die Datei darein kopiert. Ich weiß, dass man sowas mit php machen kann, aber dafür müsste ich ja immer einen Browser öffnen, oder? Ist das überhaupt mit batch realisierbar, oder geht das sogar noch besser mit einer anderen Programmierersprache? Da ich leider kein batch kann, würde ich euch auch bitten, hier vielleicht sogar ein paar Zeilen hinzuschreiben, damit ich mir nicht alles "ergooglen" muss.
Ich hoffe ihr könnt mir helfen.
LG nexalaxy
 
Willkommen nexalaxy :)

Also wenn ich so ein Programm schreiben würde, dann wäre das sowas wie eine Schleife, die regelmäßig die Dateinamen der Ordners abfragt und abspeichert. Wenn eine Datei neu ist, dann ist in der neuen Liste der Dateien ein Name drin, der in der alten Liste nicht vorhanden ist und damit weiß das Programm, die Datei ist neu und kann sie gesondert abspeichern. Das wäre mit Batch möglich, auch wenn es wahrscheinlich recht viel Leistung fordern würde, für so ein kleines Programm.

Natürlich kann ich auch jede Datei automatisch in einen Ordner schieben, der als Namen das Datum trägt, an dem sie erstellt wurde. Das ist allerdings nicht mit Batch möglich, zumindest nicht bei meinem derzeitigen Wissensstand.

Als Programmiersprache nutze ich C#, was allerdings an das .NET-Framework und damit an Windows gebunden ist, damit ist beides sicher möglich.
Ich kann dir da was programmieren.


PS:
Mit egal welcher Programmiersprache müsste das Programm allerdings dauerhaft im Hintergrund arbeiten. Bei C# würde ich das unsichtbar hin kriegen können, aber dennoch muss das Programm dauerhaft an sein und in einer Schleife laufen.
Das lässt sich nur umgehen, wenn man das Programm, mit dem du downloadest, entsprechend erweitern kann, damit es die Dateien gleich passend abspeichert, doch da kann ich dir nicht helfen.
 
Das wäre richtig nett von dir, wenn du mir sowas programmieren könntest. :)
Bei C# würde dann eine .exe Datei rauskommen, oder?
 
Ja, das ergibt dann eine exe-Datei. Allerdings brauchst du das .NET-Framework 4.0, aber das ist bei Windows schon von Haus aus dabei.


Du musst mir aber noch sagen, welche der beiden Herangehensweisen du haben willst. Jede Datei automatisch in einen Ordner, benannt nach dem Erstell-Datum, verschieben, oder nur die neu folgenden Dateien entsprechend verschieben. Bei der ersten Variante würden alle bereits vorhandenen Dateien erst in die Ordner kopiert werden.


Und hast du meinen Zusatz oben gelesen?
 
Ja dann mach das lieber in C#. ;)
Und ich hab mir das so vorgestellt:
Im Ordner ....\Tubebox liegt die batch Datei, wenn ich dann was runterlade kopiert Tubebox die mp3 Datei in den Ordner rein. Dann erstellt die batch Datei einen neuen Ordner, je nachdem heutigen Datum, also z.B. für heute "2013_03_23". Dann soll die gerade in den Ordner Tubebox kopierte mp3 Datei noch in den gerade erstellten Ordner verschoben werden.
 
Also kopieren muss ich das vorher nicht, ich leg die gleich in den entsprechenden Datums-Ordner ^^
Sollen beim ersten Start alle enthaltenen Dateien erst einmal in die Ordner sortiert werden, oder können die bleiben?

Sollen alle Dateien kopiert werden? Oder nur bestimmte Datei-Typen?

PS: Hab grad gelesen, mp3-Dateien, also werden halt nur mp3-Dateien kopiert, oder auch weitere?
 
1. Nein, hab das schon durch mühselige Handarbeit gemacht -.-
2. Nein, verschieben reicht
3. Ich habe da eh nur .mp3 Dateien drin ;)
 
Also der aktuelle Stand sieht so aus:

Das Programm sammelt alle Dateien im Ordner, in dem die exe gestartet wurde und verschiebt jede Datei in einen neuen Ordner, der den Namen des Datums trägt, an dem die jeweilige Datei gestartet wurde. Existiert der Ordner bereits, wird sie nur dort hinein geschoben.
Dieser Ablauf wiederholt sich jede Sekunde, also eine neue Datei wird fast sofort verschoben.

Beim Start des Programms wird eine Meldung angezeigt, dass die Datei-Verwaltung aktiv ist. Danach schließt sich das Fenster und das Programm arbeitet ohne sichtbare Oberfläche im Hintergrund. Schließen musst du es über den Task-Manager.
Leider hab ich es bis jetzt nicht hin gekriegt, eine Tasten-Kombination einzubauen, sodass es sich damit schließen lässt. Im Task-Manager findest du das Programm unter Prozesse und der Abbildname ist der gleiche, wie der Name der exe-Datei.

Ich kann natürlich auch die Konsole zeigen, dann wird da die Meldung angezeigt und wenn du die Konsole schließt, ist das Programm auch aus, aber dann hast du das Programm als Fenster und auch in der Task-Leiste, was ich eigentlich blöde finde für ein Programm, das unsichtbar im Hintergrund arbeiten soll.


verborgener Text:
PHP:
using System;
using System.Collections.Generic;
using System.IO;
using Shell32;
using System.Windows.Forms;
using System.Reflection;
using System.Threading;

namespace Tools
{
    static class Program
    {
        static void Main(string[] args)
        {
            MessageBox.Show("Die automatische Datei-Verwaltung wurde gestartet.", "FileManagement: Info", MessageBoxButtons.OK);
            for (;;)
            {
                foreach (var item in Directory.GetFiles(Environment.CurrentDirectory))
                {
                    if (item == Assembly.GetExecutingAssembly().Location) continue;
                    string directoryName = GetDirectoryName(DateTime.Parse(new FileInfo(item).GetDetails()["Erstelldatum"]).Date);
                    if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);
                    File.Move(item, GetValidateFileName(Path.Combine(directoryName, Path.GetFileName(item))));
                }
                Thread.Sleep(1000);
            }
        }
        static string GetValidateFileName(string name)
        {
            int i = 0;
            while (File.Exists(name + (i == 0 ? "" : " [" + i.ToString() + "]"))) i++;
            return name + (i == 0 ? "" : " [" + i.ToString() + "]");
        }
        static string GetDirectoryName(DateTime date)
        {
            return (date.Day < 10 ? "0" + date.Day.ToString() : date.Day.ToString() + "_" + (date.Month < 10 ? "0" + date.Month.ToString() : date.Month.ToString()) + "_" + date.Year.ToString());
        }
        static Dictionary<string, string> GetDetails(this FileInfo fi, int IndexCounter = 300)
        {
            Dictionary<string, string> ret = new Dictionary<string, string>();
            var shl = (Shell)Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
            Folder folder = shl.NameSpace(fi.DirectoryName);
            FolderItem item = folder.ParseName(fi.Name);
            for (int i = 0; i < IndexCounter; i++)
            {
                string dtlDesc = folder.GetDetailsOf(null, i);
                string dtlVal = folder.GetDetailsOf(item, i);
                if (dtlVal == null || dtlVal == "") continue;
                ret.Add(dtlDesc, dtlVal);
            }
            return ret;
        }
    }
}
 

Anhänge

  • FileManager.rar
    3,9 KB · Aufrufe: 238
Was ich doch immer ziemlich doof schade finde, ist, wenn man sich die Arbeit macht um jemandem zu helfen und nicht mal eine Rückmeldung erhält, dass die Hilfe gut war, geschweige denn ein Danke.
 
Oben