Letztes Mal habe ich die Generierung der Datei der Löschzielliste abgeschlossen. Der Inhalt der Datei sieht folgendermaßen aus.
\TMP\200104\delete.txt
C:\TMP\IMG_2607(1).jpg
C:\TMP\IMG_2608(1).jpg
\TMP\200105\delete.txt
C:\TMP\IMG_2610(1).jpg
C:\TMP\IMG_2610(2).jpg
C:\TMP\IMG_2611(1).jpg
In jedem Jahr / Monat-Ordner (JJJJM) befindet sich delete.txt, der den vollständigen Pfad der Datei enthält, die Sie zeilenweise löschen möchten. Lesen Sie diese also einfach und löschen Sie sie. Da es sich noch in der Testphase befindet, werde ich den Prozess für den Testordner schreiben.
Python : 3.8.3
DeleteAll.py
import glob
import os
if __name__ == "__main__":
files = glob.glob("C:\\tmp\\**\\delete.txt", recursive=True)
for file in files:
with open(file, "r") as f:
for line in f.readlines():
os.remove(line.strip())
Mr. Glob. Warum bleibt '\ n'am Ende beim Lesen mit readlines ()? (Ein wenig störend)
C# : 8.0(Microsoft Visual Studio Community 2019)
DeleteAll.cs
using System;
using System.IO;
using System.Text;
namespace DeleteAll
{
class DeleteAll
{
static void Main()
{
var files = Directory.GetFiles(@"c:\tmp", "delete.txt", SearchOption.AllDirectories);
foreach (var file in files)
{
foreach (var line in File.ReadAllLines(file, Encoding.GetEncoding("Shift-JIS")))
{
File.Delete(line);
}
}
}
}
}
Normalerweise denke ich nicht darüber nach, aber als ich es neben Python stellte, schienen die Klammern sehr störend zu sein ...
VisualBasic : 6.0
DeleteAll.bas
Option Explicit
Private colFiles As Collection
Public Sub Main()
Set colFiles = New Collection
Call GetFiles("C:\TMP\")
Call DeleteFiles(colFiles)
End Sub
Private Sub GetFiles(ByVal strSearchPath As String)
Dim FSO As FileSystemObject
Set FSO = New FileSystemObject
Dim objSubFolder As Folder
For Each objSubFolder In FSO.GetFolder(strSearchPath).SubFolders
Call GetFiles(objSubFolder.Path)
Next
Dim objFile As file
For Each objFile In FSO.GetFolder(strSearchPath).files
If LCase(objFile.Name) = "delete.txt" Then
Call colFiles.Add(FSO.BuildPath(strSearchPath, objFile.Name))
End If
Next
End Sub
Private Sub DeleteFiles(ByVal files As Collection)
Dim FSO As FileSystemObject
Dim vntFile As Variant
Set FSO = New FileSystemObject
For Each vntFile In files
With FSO.GetFile(vntFile).OpenAsTextStream(ForReading)
Do
Kill .ReadLine()
Loop Until (.AtEndOfLine())
End With
Next
End Sub
In der altmodischen ungarischen Notation. Es ist sehr mühsam, die rekursive Suche selbst zu implementieren. Daher ist es wichtig, ohne Verwendung von FileSystemObject zu binden. Die Variablendeklaration in GetFiles () wird geschrieben, um Dim zu deklarieren, kurz bevor sie angezeigt wird. In der alten VB6-Quelle ist es jedoch üblich, die Deklaration zu Beginn der Methode gemeinsam zu schreiben. Ich denke, es ist der Stil von Leuten, die C-> VB flossen, aber ich sehe oft Shit-Code, der 500 Zeilen pro Methode nur für solche Quellen enthält.
DeleteAll.bat
@echo off
cd \tmp
for /f "usebackq" %%i in (`dir /s /b delete.txt`) do (for /f %%j in (%%i) do del %%j)
Wie einfach eine Batchdatei ist! Stattdessen ist das Format etwas esoterisch.
Damit ist dieser Fall abgeschlossen. Was machen wir jetzt als nächstes?
Recommended Posts