WinFuture-Forum.de: Downloads durchlaufend nummerieren und in einen neuen Ordner verschieb - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Downloads durchlaufend nummerieren und in einen neuen Ordner verschieb


#1 Mitglied ist offline   Christmasdonkey 

  • Gruppe: Mitglieder
  • Beiträge: 1
  • Beigetreten: 23. April 19
  • Reputation: 0

geschrieben 23. April 2019 - 11:55

Hallo liebe Community,
leider habe ich nicht viel Erfahrung im Programmieren, geschweige denn in dem Schreiben vom Programmen mit Batch.
Ich nutze schon Suchmaschinen und diverse Foren als Hilfe, aber spätestens bei der Syntax hapert es dann richtig… deswegen hoffe ich hier auf Hilfe!

Ich möchte eine Vielzahl an Dateien nach und nach runterladen, die ich fortlaufend nummerieren (zwecks späterer Sortierung) möchte.

Ich habe auch schon folgenden Code gefunden:

@ECHO OFF

REM Aufgabe:
REM Kopiere alle Dateien aus Quelle nach Ziel
REM und benenne sie dabei fortlaufend numerisch um
REM und behalte den Dateityp bei

REM Lokale Parameter
SET Quelle=C:\Quellordner
SET Ziel=C:\Zielordner
REM Startwert für die Nummer
SET Zahl=1000

REM Wir müssen erst die "Delayed Expansion" einschalten 
SETLOCAL ENABLEDELAYEDEXPANSION

REM Das DIR-Kommando gibt die Dateien in der gewünschten Folge zurück
FOR /F "usebackq tokens=*" %%i IN (`DIR %Quelle% /A:-D /B`) DO (
	ECHO Alt: %Quelle%\%%i
	REM "Delayed Expansion" per Notation nutzen: Die Variable, die in jedem Durchlauf
	REM erweitert werden soll, muss in Ausrufezeichen eingefasst sein
	SET /A Zahl=!Zahl!+1
	REM Um die ursprüngliche Dateierweiterung beizubehalten, hier nochmal
	REM derselbe Trick, diesmal mit Zeichenfolgen-Funktion (4 letzte Zeichen)
	SET Zielname=%%i
	ECHO Neu: %Ziel%\!Zahl!!Zielname:~-4!
	ECHO.
	COPY %Quelle%\%%i %Ziel%\!Zahl!!Zielname:~-4!
	ECHO.
	)



Das Programm setzt leider nur Voraus, dass die Dateien bereits schon alle im Quellordner vorhanden sind.

Ich hätte jedoch gerne eine Schleife, die erkennt, wenn sich im Quellordner eine Datei befindet, diese mit einer fortlaufenden Nummer in den Zielordner verschiebt. Falls sich keine Datei im Quellordner befindet, soll das Programm eine Sekunde warten und dann erneut prüfen und das so oft, bis sich wieder eine Datei im Quellordner befindet und diese dann fortlaufend nummeriert und verschiebt.
Das heißt, durch die Batch würde in einer Endlosschleife laufen, die ständig auf neue Dateien wartet.

Ich hoffe ihr könnt mir helfen.

Mit freundlichen Gruß und Dank im Voraus,
Christmasdonkey
0

Anzeige



#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 24. April 2019 - 19:26

Ich seh spontan drei Möglichkeiten:

- 1 Du besorgst Dir msys2 für Windows. Damit kannst Du gängige UNIX/Linuxtools unter Windows verwenden, einschließlich curl/wget zum Herunterladen von Dateien und bash, perl, python und andere Interpreter, um ein Script drumherum zu bauen, was Du möchtest.

- 2 Du besorgst Dir Visual Studio, aktuell in Version 2019, oder natürlich irgendeine andere Entwicklungsumgebung. Damit kannst Du in C# oder ggfs. in Visual Basic.NET relativ einfach eine Anwendung bauen, die auf Ereignisse (cf Events) reagiert. In diesem Fall wäre das Ereignis, Datei wurde auf den Datenträger geschrieben. Solche Ereignisse lassen sich abfangen und drauf reagieren. Das spart die Endlosschleife. Hier mußt Du Dich allerdings erwartungsgemäß am meisten reinfitzen. Powershell wäre eine Option, die in dieselbe Kerbe schlägt, ist aber an dieser Stelle möglicherweise noch aufwendiger, da großteils auf C#/VB.NET-Funktionalität zurückgegriffen werden muß, jedoch die Ereignisbehandlung durch PowerShell selbst gehandhabt wird. Außerdem müßte die ganze Zeit eine Powershell-Konsole laufen, was Du sonst nicht hättest.

-3 Der einfache Weg ist sowas wie WatchDirectory. Das macht genau das, was Du möchtest. Allerdings bin ich nicht sicher, ob es das auch als kostenlose Alternative gibt.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#3 Mitglied ist offline   der dom 

  • Gruppe: aktive Mitglieder
  • Beiträge: 578
  • Beigetreten: 14. Juni 12
  • Reputation: 73
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Mein Haus, meine IT, Programmierung

geschrieben 25. April 2019 - 17:25

Dafür gibt's in .NET den FileSystemWatcher. Der reagiert auf diverse Dateiereignisse. Und du kannst super nach Dateityp und Event filtern.

Wenn man damit nicht zurecht kommt könnte man das auch mit einem Timer lösen (wie von dir gewünscht) - das Ganze ginge dann synchron (kann passieren dass dir dann die GUI blockiert) oder asynchron in einem separaten Thread.

Die Nummerierung ist als solches kein Problem. Da könnte man eine Variable in eine Datei oder in die Probs schreiben damit man die ganzen Dateinamen im Zielordner nicht durchgehen müsste.

Je nachdem von wo du Downloaden magst und was könnte man das über Webrequests mit den entsprechend URLs (vorausgesetzt bekannt) direkt im Source von dem Programm regeln.

Der Aufwand wäre überschaubar - und wenn man es gänzlich im Hintergrund laufen lassen wollen würde ohne GUI (Maske), dann könnte man einen Dienst draus bauen. Auch nicht die Welt :-).

Wie sollen denn die Dateien heißen? Einfach Stumpf durchnummeriert oder 1 - Name.xxx; 2 - Name.xxx; 3 - Name.yyy?

Kann dir gerne auch ein Beispiel in C# fertig machen.

Würde dir das so ausreichen:

Angehängtes Bild: Bildschirmfoto 2019-04-25 um 19.06.19.png


Habe flink was zusammengebaut:

using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
namespace CopyFilesCountingUp
{
    class Program
    {
        static FileSystemWatcher fReactOnCreation;
        static Timer tReactOnElapsed;

        private static string Source { get; set; }

        private static string Destination { get; set; }

        private static int Duration { get; set; }

        private static int iCount = 0;

        static void Main(string[] args)
        {
            Thread.Sleep(5000);
            Debug.WriteLine("collecting");
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            Debug.WriteLine("collected");
            Thread.Sleep(5000);
            if (args.Length == 0)
            {
                Console.Write("Beispiel Timer: CopyFilesCountingUp.exe T 10000 C:\\Downloads\\ C:\\MeinOrder\\ \r\nAuswahl Funktion: T = Timer; F = Dateisystemüberwachung\r\n2: Auswahl Zeitspanne: 0 bei F benutzen, sonst Zeit in Millisekunden\r\n3: Quellordner\r\n4: Zielordner");
                Console.ReadLine();
            }
            if (args.Length > 1)
            {
                Source = args[2];
                Destination = args[3];
                Duration = Convert.ToInt32(args[1]);
            }
            if (args.Length > 0)
            {
                switch (args[0])
                {
                    case "T":
                        Console.WriteLine("Warten auf Timer....");
                        tReactOnElapsed = new Timer(tCallBack, null, Duration, Timeout.Infinite);
                        Console.ReadLine();
                        break;
                    default:
                        Console.Write("Beispiel Timer: CopyFilesCountingUp.exe T 10000 C:\\Downloads\\ C:\\MeinOrder\\ \r\nAuswahl Funktion: T = Timer; F = Dateisystemüberwachung\r\n2: Auswahl Zeitspanne: 0 bei F benutzen, sonst Zeit in Millisekunden\r\n3: Quellordner\r\n4: Zielordner");
                        Console.ReadKey();
                        break;
                }
            }

        }

        /// <summary>
        /// Wenn der Timer abgelaufen ist, wird das Verzeichnis überprüft und
        /// der Verschiebevorgang startet. 
        /// </summary>
        static void tCallBack(Object state)
        {
            try
            {
                using (FileStream fs = new FileStream(Environment.CurrentDirectory + "\\count.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        iCount = Convert.ToInt32(sr.ReadLine());
                    }
                }
                                 

                var getFilesInDir = new DirectoryInfo(Source).GetFiles("*.*");

                foreach (FileInfo f in getFilesInDir)
                {
                    if (!f.Extension.Contains("part"))
                    {
                        Console.WriteLine(DateTime.Now.ToString() + " : Datei " + f.Name + " wird verschoben...");

                        f.MoveTo(Destination + "\\" + iCount + " - " + f.Name);
                        Console.WriteLine(DateTime.Now.ToString() + " : Datei " + f.Name + " wurde verschoben und umbenannt in " + iCount + " - " + f.Name + "...");
                    }
                    else
                    {
                        Console.WriteLine(DateTime.Now.ToString("Datei wird noch heruntergeladen"));
                    }

                    iCount++;
                    using (FileStream fs = new FileStream(Environment.CurrentDirectory + "\\count.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                    {
                        using (StreamWriter sr = new StreamWriter(fs))
                        {
                            sr.WriteLine(iCount);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.DarkRed;
                Console.Write(ex.Message);
                Console.ForegroundColor = ConsoleColor.Gray;
            }
            finally
            {
                Thread.Sleep(5000);
                Debug.WriteLine("collecting");
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                Debug.WriteLine("collected");
                Thread.Sleep(5000);
                tReactOnElapsed = new Timer(tCallBack, null, Duration, Timeout.Infinite);
            }
        }
    }
}




Die Datei count.txt muss im Programmverzeichnis vorhanden sein und mit deiner Startnummer beginnen (0 oder 1 oder was auch immer). Danach brauchst du sie nicht mehr anfassen - wird automatisch hochgezählt und gesichert.

Gruß,
Dom

Dieser Beitrag wurde von der dom bearbeitet: 25. April 2019 - 18:55

Mit allem, was du tust, machst du offenkundig, mit welcher Einstellung du durch's Leben gehst. -- Steffen Glückselig
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0