[JAVA] Ich möchte Dateien, die bei der Arbeit verwendet werden, einfach sichern

Probleme im Unternehmen

Bei der Arbeit behalte ich oft ein Backup meiner Materialien. Der Hauptgrund ist die Dateiversionierung.

Die Methode besteht darin, die Datei im Explorer zu kopieren und Datum und Uhrzeit in den Dateinamen einzugeben, damit Sie das Änderungsdatum und die Änderungszeit jeder Datei sehen können, bevor Sie die neueste Version ändern. Es sieht so aus (↓). pic-20190705T1416.png

Es gibt viele Dienste auf der Welt, die Dateiversionen bequem verwalten können, wie z. B. Box, und ich denke, viele Leute verwenden sie. Dieses Verfahren hat jedoch auch Vorteile.

Andererseits ist der ** problematische Punkt ** dieser Verwaltungsmethode, dass das Verfahren wie folgt kompliziert ist.

  1. Kopieren Sie "Proposal.docx" und fügen Sie es ein ([Strg] + [C][Strg] + [V])
  2. Erstellen Sie eine Datei mit dem Namen "Proposal-Copy.docx".
  3. Ändern Sie den Teil "--copy" des Dateinamens in Datum und Uhrzeit. Dies ist problematisch, da Sie das Änderungsdatum der Datei überprüfen.

Es stört mich kein einziges Mal, aber wenn ich das jeden Tag und viele Male wiederhole, wird es ziemlich nervig. Wenn ich aufgrund eines Tippfehlers einen Fehler im Datum gemacht habe, wird die Aktualisierungsreihenfolge beim Anordnen nach Dateinamen unterbrochen.

Ich habe ein Tool erstellt, damit ich es sofort sichern kann

Also habe ich beschlossen, ein Werkzeug zu machen und es einfacher zu machen. Die Bedingung ist, dass die Datei mit dem Namen "-latest" unmittelbar vor der Dateierweiterung angezeigt wird, z. B. "Proposal -latest.docx".

Wenn Sie die Datei per Drag & Drop auf das Tool im Explorer ziehen, wird sie automatisch gesichert und der Dateiname aktualisiert. Eine Batch-Datei namens "backup.bat" ist ein Tool, und Sie ziehen die Zieldatei einfach per Drag & Drop in die Batch-Datei.

In der Batch-Datei werden Java-Programme ausgeführt. pic-20190705T1556.png

Die folgende Abbildung zeigt das Ausführungsergebnis. Dies ist praktisch, da Sie eine Sicherung mit nur einem Klick durchführen können. pic-20190705T1435.png

Quellcode

Der Quellcode sieht so aus. Es funktioniert mit einer Kombination aus Java- und Batch-Dateien. Kompilieren Sie Ihr Java-Programm und legen Sie die Klassen- und Batchdateien in demselben Ordner ab.

Ziehen Sie zum Zeitpunkt der Ausführung die Datei, die Sie sichern möchten, in die Batchdatei im Explorer und legen Sie sie dort ab (siehe Abbildung oben). Erstellen Sie eine Sicherung im selben Ordner wie die Zieldatei.

In meinem Fall erstelle ich außerdem eine Verknüpfung für das Tool (Batchdatei) auf dem Desktop und ziehe sie per Drag & Drop auf die Verknüpfung.

CopyAndBackupFile.java


import java.net.*;
import java.nio.file.*;
import java.text.*;
import java.util.*;

public class CopyAndBackupFile {
  private static final String DEFAULT_PLACE_HOLDER = "latest";
  private static final SimpleDateFormat FORMAT_PREFIX = new SimpleDateFormat("YYYYMMdd");
  private static final SimpleDateFormat FORMAT_SUFFIX = new SimpleDateFormat("HHmm");

  public static void main(String[] args) throws Exception {
    int argc = 0;
    String placeHolder;
    
    if (args[argc].equals("-p")) {
      placeHolder = args[++argc];
      ++argc;
    } else {
      placeHolder = DEFAULT_PLACE_HOLDER;
    }

    assert placeHolder != null : "Placeholder is null";

    Path[] paths = new Path[args.length - argc];
    for (int i = 0; i < paths.length; i++, argc++) {
      paths[i] = Paths.get(args[argc]);
    }

  rename_loop:
    for (int i = 0; i < paths.length; i++) {
      Path pathOrg = Paths.get(paths[i].toString());
      Path dir = pathOrg.getParent();
      Path file = pathOrg.getFileName();

      String sFile = file.toString();
      
      int phStart = sFile.lastIndexOf(placeHolder);
      if (phStart < 0) {
        System.err.printf("ERROR: %s does not include \"%s\"%n", sFile, placeHolder);
        continue rename_loop;
      }
      int phEnd = phStart + placeHolder.length();
      
      long lastModified = pathOrg.toFile().lastModified();
      Date date = new Date(lastModified);
      
      String backupDate = FORMAT_PREFIX.format(date)
                                       .concat("T")
                                       .concat(FORMAT_SUFFIX.format(date));
      

      String sFileNew = sFile.substring(0, phStart)
                             .concat(backupDate)
                             .concat(sFile.substring(phEnd));
      
      Path pathNew = Paths.get(dir.toString(), sFileNew);
      
      System.out.printf("%s -> %s%n", pathOrg, pathNew);
      Files.copy(pathOrg, pathNew);
    }
  }
}

backup.bat


@echo off
setlocal

rem
rem The top directory of the tool
rem
set __tools_dir=%~d0%~p0
set __last_char=%__tools_dir:~-1%
if "%__last_char%"=="\" set __tools_dir=%__tools_dir:~0,-1%


rem
rem Environment variables
rem
set __java_bin_dir=C:\ProgramData\Oracle\Java\javapath
set __classpath=%__tools_dir%

if "%JAVA_HOME%"=="" (
  echo WARNING: JAVA_HOME is empty. Using %__java_bin_dir%
) else ( 
  set __java_bin_dir=%JAVA_HOME:"=%\bin
)

if not exist "%__java_bin_dir%\java.exe" (
  echo ERROR: %__java_bin_dir%\java.exe does not exist
  echo ERROR: set JAVA_HOME to the top directory of Java SE 7 or later
  goto :EOF
)

set __java_options=


rem 
rem Run
rem
@echo on
"%__java_bin_dir%\java.exe" %__java_options% -classpath "%__classpath%" CopyAndBackupFile %*
@echo off

@endlocal

Artikelkorrektur (14. Juli 2019)

Es gab eine falsche Beschreibung, dass "Box" ein "Microsoft-Dienst" ist, daher habe ich ihn korrigiert. Wir entschuldigen uns für die Korrektur.

Recommended Posts

Ich möchte Dateien, die bei der Arbeit verwendet werden, einfach sichern
Eine Sammlung von Links, denen Sie helfen möchten, wenn JSF überhaupt nicht funktioniert
Ich möchte eine von Git verwaltete Datei löschen
Ich möchte Zeichen konvertieren ...
Ich möchte rekursiv nach Dateien in einem bestimmten Verzeichnis suchen
Ich möchte OutOfMemory bei der Ausgabe großer Dateien mit POI vermeiden
Ich möchte JSP in Emacs einfacher als die Standardeinstellung schreiben.
Ich möchte eine Webanwendung entwickeln!
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich möchte ein schönes build.gradle schreiben
Ich möchte doppelte Fehlermeldungen beseitigen
Ich möchte eine ios.android App machen
Ich möchte DBViewer mit Eclipse 2018-12 verwenden! !!
Ich möchte einen Unit Test schreiben!
Ich möchte PHP 7.2 unter Ubuntu 20.04 installieren.
Ich möchte Java-Updates insgesamt stoppen
Ich möchte @Autowired in Servlet verwenden
Ich möchte statische Felder auf @Autowired ausrichten
Ich möchte die Teamentwicklung aus der Ferne durchführen
[Android] Ich möchte einen ViewPager erstellen, der für Tutorials verwendet werden kann