Une histoire sur l'exécution d'un programme qui copie des fichiers en Java à partir d'un fichier chauve-souris pour rendre le travail quotidien un peu plus efficace

Préface

Je soumettrai un journal interne chaque jour. Pour être honnête, il est difficile de copier le fichier tous les jours et de mettre la date d'aujourd'hui. Je ne suis pas doué pour cliquer.

C'est pourquoi je l'ai automatisé autant que possible.

Plus précisément, une copie avec la date dans le nom du fichier sera générée avec un simple double clic. Je n'ai pas falsifié le contenu du fichier xls. Il semble y avoir une bibliothèque qui peut le faire, mais cette fois, elle est désactivée.

J'ai utilisé Java et des fichiers batch.

J'ai pu faire tout ce que je voulais faire et apprendre.

Expliqué ci-dessous.

Java

Pour le moment, du programme lui-même.

programme

copyReport.java


package copyReport;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

 public class CopyReport {
	public static void main(String[] args) {
		//Demandez-leur de mettre un dossier sur leur bureau
		String desktopPath = "C:\\Users\\"+System.getProperty("user.name")+"\\Desktop";
		String folderPath = desktopPath+"\\copyreport";

		//Obtenez les noms de fichiers dans le dossier du programme sous forme de tableau
		File[] files = new File(folderPath).listFiles();

		//Obtenez le nom du fichier source de la copie. J'ai permis de le changer en mon propre nom.
		String baseFileName = "";
		for(File f:files) {
			if(f.getName().matches(".*Rapport journalier_.*\\.(xls|xlsx|ods)")) {
				baseFileName = f.getName();
			}
		}

		//Vérifier la copie du fichier source
		if(baseFileName.isEmpty()) {
			System.out.println("Le fichier source de la copie est introuvable dans le rapport de copie.");
			return;
		}
		File baseFile = new File(folderPath,baseFileName);
		if(!baseFile.exists()) {
			System.out.println("Le fichier source de la copie est introuvable.");
			return;
		}

		//Générer le nom du fichier du jour à partir de la date
		String today = LocalDate.now().format(DateTimeFormatter.ofPattern("YYYYMMdd"));
		String outFileName = today + baseFileName.substring(baseFileName.lastIndexOf("Rapport journalier_"));
		System.out.println(outFileName + "Copier comme.");

		//Vérifiez s'il existe déjà
		File outFile = new File(desktopPath,outFileName);
		if(outFile.exists()) {
			System.out.println("Le fichier de destination existe déjà.");
			return;
		}

		//Message de sortie
		System.out.println("Copiez le fichier.");
		System.out.println("Copier le nom du dossier source;"+folderPath);
		System.out.println("Copier le nom du fichier source:"+baseFile.getName());
		System.out.println();
		System.out.println("Copier le nom du dossier de destination;"+desktopPath);
		System.out.println("Copier le nom du fichier de destination:"+outFile.getName());

		try {
			//Créer un flux à partir de l'instance de fichier source / destination de la copie
			FileInputStream fis = new FileInputStream(baseFile);
			FileOutputStream fos = new FileOutputStream(outFile);

			//Gérer les tampons et lire les octets
			byte[] buf = new byte[256];
			int len=0;
			//Lire et écrire dans chaque flux jusqu'à la fin du fichier
			while((len = fis.read(buf)) != -1) {
				fos.write(buf,0,len);
			}

			//Écrivez la partie qui n'est pas écrite
			fos.flush();

			//Terminer l'accès au fichier
			fos.close();
			fis.close();

			//message
			System.out.println("Le fichier a été copié avec succès.");

		} catch (FileNotFoundException e) {
			System.out.println("Échec de la copie du fichier.");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Échec de la copie du fichier.");
			e.printStackTrace();
		}

	}

}

Description du programme

Puisqu'il ne s'agit pas d'un outil destiné à être largement publié, il est conçu pour «placer un dossier directement sur le bureau et l'exécuter».

Emplacement du bureau

L'emplacement du bureau Windows 10 que vous utilisez est C: \ user \ (USER name) \ Desktop, qui varie d'une personne à l'autre, alors obtenez-le à partir de System.getproperty (nom d'utilisateur) et entrez-le.

Tableau de fichiers

Puisqu'il s'agit d'un dossier pour stocker les programmes, copier les fichiers source et les fichiers bat d'exécution, il a une structure en deux étapes pour obtenir le nom complet → obtenir le nom du fichier source de la copie.

condition de correspondance

(Tout élément de date) Rapport quotidien_ (Tout nom). (Xls ou xlsx ou ods) Expression régulière. Obtenez le fichier correspondant comme nom de fichier source de la copie. En faisant cela, si votre nom est inclus dans le nom de fichier d'origine, il sera copié tel quel.

Vérifier la source de la copie

Je ne pense pas que ce soit excessif, mais c'est plus gênant quand il y a un écart.

Générer le nom du fichier à partir de la date

Obtenez la date du jour sous forme de chaîne numérique à 8 chiffres. Créez un nom de fichier de destination de copie en le plaçant dans la première moitié du nom de fichier source de la copie.

Copier la vérification de la destination

Ce serait un problème si le rapport quotidien que j'ai écrit sur le contenu était écrasé (je pense que je ne l'ai pas écrasé en premier lieu), alors vérifiez-le pour le moment.

Copie du dossier

Cette fois, j'ai décidé d'utiliser FileInputStream et FileOutoutStream. Il semble que le buf, qui est le contenu lu à partir de FileInputStream en len octets à la fois, est envoyé à FileOutputStream. Quand je l'ai recherché, il était écrit de la même manière dans tous les matériaux, mais à cause de cela, il y avait peu d'échantillons et il était difficile de comprendre le mécanisme.

enfin traiter

J'ai rincé manuellement la partie qui ne pouvait pas être rincée ou mis fin à l'accès. Il semble que le traitement de la terminaison d'accès sera effectué pour Java 8 ou version ultérieure.

Voilà donc pour la programmation java. Après cela, vous pouvez exporter depuis Eclipse ou double-cliquer sur le fichier jar pour l'exécuter.

Exporter dans Eclipse

Faites-le comme il se passe avec Fichier-> Exporter-> Fichier jar exécutable. Dans quelle mesure le nom du fichier jar, le nom du projet, le nom de la classe principale, etc. doivent-ils être alignés? Terminé si un fichier jar est généré autour du bureau.

Création d'un environnement d'exécution Java

Celui appelé JRE. Était-ce un environnement d'exécution Java? Requis pour exécuter java (commande java, commande javac) à partir de l'invite de commande.

Si vous avez Eclipse, c'est rapide, prenez le chemin depuis Écran → Paramètres → Java → Environnement d'exécution et mettez-le dans la variable d'environnement du PC. Il semble que vous puissiez spécifier directement java.exe ou javac.exe, mais cette fois spécifiez le dossier directement sous eux. Une fois que je l'ai mis, je l'ai laissé, alors j'ai complètement oublié de le mettre et j'étais impatient.

Confirmation d'exécution

À l'invite de commande, déplacez "java -jar copyReport.jar" du dossier contenant le fichier .jar et vérifiez l'opération. Le nom du fichier est celui de l'exportation depuis Eclipse.

Créer un fichier chauve-souris

Créez un fichier .bat avec un nom approprié et modifiez-le avec le Bloc-notes. Contenu comme celui-ci

copy.bat


@echo off
cd ./copyreport
java -jar copyReport.jar
timeout 5 

La description

La première ligne

Il n'est pas nécessaire d'afficher le contenu des entrées de commande suivantes (écho désactivé) Vous n'avez pas besoin d'afficher la commande (@)

2e ligne

Une commande pour déplacer l'emplacement actuel de la console vers le dossier copyreport directement sous le dossier lancé. Même si vous faites une erreur, elle ne tombera pas, vous pouvez donc l'exécuter en toute confiance. Si le dossier nommé copyreport dans le dossier copyreport échoue, l'avenir ne fonctionnera pas.

3e ligne

Exécutez le fichier java spécifié en tant que fichier jar avec java

4ème ligne

Fermez cet écran après 5 secondes. Si vous recevez un message mais que vous souhaitez le supprimer, ajoutez "> nul" à la fin. La signification de ceci est "Veuillez envoyer le message à nul".

Ce que j'ai appris

Je l'ai écrit après avoir examiné l'opération de fichier, mais cela a pris presque une journée entière. FileInputStream # read est compliqué, et il semble que le contenu de buf et len soit confus en fonction de la méthode de surcharge, donc honnêtement, j'ai été très troublé. Cela ne change pas le PC autour de l'environnement d'exécution, il est donc facile de l'oublier, alors soyez prudent.

Recommended Posts

Une histoire sur l'exécution d'un programme qui copie des fichiers en Java à partir d'un fichier chauve-souris pour rendre le travail quotidien un peu plus efficace
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Exemple de programme qui renvoie la valeur de hachage d'un fichier en Java
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java
Une histoire sur le JDK à l'ère de Java 11
Histoire d'essayer de faire fonctionner le fichier JAVA
Un fichier bat qui utilise Java dans Windows
Comment gérer le type auquel j'ai pensé en écrivant un programme Java pendant 2 ans
L'histoire que Tomcat a souffert d'une erreur de timeout dans Eclipse
Une histoire sur l'évolution des compétences du COBOL cultivé pendant 5 ans à la fin des années 20 à un langage Web
Une histoire sur un projet Spring Boot écrit en Java qui prend en charge Kotlin
Une histoire sur la conversion des codes de caractères de UTF-8 en Shift-jis en Ruby
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Que faire à propos de "Un serveur est déjà en cours d'exécution ..." qui s'est produit sans désactiver le serveur de rails dans le terminal