2009-03-24 9 views
1

J'ai eu un programme de travail sur certaines images de la mienne et il les a renvoyés à mon répertoire. chose amusante, ils sont maintenant toutes les images png au lieu de gif. Au début, je pensais que c'était un simple changement de nom, mais j'ai testé avec php en utilisant createimagefrompng(), ce qui va générer une erreur si l'image n'est pas un fichier png valide. Aucune erreur n'a été renvoyée. Que ce soit ou non cela me donne un résultat 100% précis n'est pas le problème ici, le problème est que je veux renommer tous ces fichiers d'une manière similaire.Renommer des fichiers de la même manière encore et encore

Maintenant, alors que je pourrais écrire un fichier php pour faire cela pour moi, je me demande comment je pourrais faire ce qui suit en batch ou C# ou java.

Tous ces fichiers contiennent toujours la chaîne ".gif", et je veux supprimer cela. En php, ce serait aussi simple que d'utiliser une boucle foreach, de lire le fichier, d'utiliser str_replace, puis de détruire l'ancien et d'écrire le nouveau.

Je suis un peu bloqué quant à la façon dont je le ferais en batch, C# ou java, quelqu'un peut-il m'aider ici?

En outre, je cours Windows Vista et j'ai installé Powershell 1.0.

Solution 1 - C#:

var files = Directory.GetFiles(@"C:\Downloads\Temp\test\"); 
foreach (var file in files) 
{ 
    if(file.Contains(".gif")) 
    { 
    string testing = string.Format("{0}.png", Path.GetFileNameWithoutExtension(file.Replace(".gif", ""))); 
    File.Move(file, @"C:\Downloads\Temp\test\"+testing); 
    } 
} 
+0

Vous devez d'abord vous assurer que si vous essayez manuellement de changer le nom en gif, ils ne se casseront pas. Le programme a peut-être converti vos fichiers. – jjnguy

+0

Je pense que vous ne comprenez pas: le programme a déjà converti mes fichiers en fichiers .png. Ceci est l'extension, et le ".gif" avant cela sera considéré comme faisant partie du nom de fichier par le système d'exploitation. Donc je veux enlever cette partie du nom de fichier. – KdgDev

+0

quelle version de Windows utilisez-vous? – TofuBeer

Répondre

1

Vous pourriez probablement faire quelque chose dans la mesure de ce qui suit dans C#

var files = new DirectoryInfo(@"c:\files").GetFiles(@"*.gif"); 
foreach (var file in files) 
    File.Move(file.FullName, string.Format("{0}.gif", Path.GetFileNameWithoutExtension(file.FullName))); 

ou plus simplement ..

var files = Directory.GetFiles(@"c:\files", @"*.gif"); 
foreach (var file in files) 
    File.Move(file, string.Format("{0}.gif", Path.GetFileNameWithoutExtension(file))); 
+0

var files = Directory.GetFiles (@ "c: \ fichiers ", @" *. gif "); fonctionne aussi bien sans créer une instance DirectoryInfo. – Lucas

+0

en fait, toutes les filles sont actuellement comme ceci: "filename.gif.png". Et je veux les changer en "filename.png". Mais avec votre indice, je pense que je serai capable de le faire. – KdgDev

+0

En fait, quelque chose peut mal tourner ici. La fonction File.Move() nécessite que le nouveau chemin soit absolu. Donc juste ajouter "filename.png" comme le nouvel emplacement va lancer et IOException, au moins c'est ce que Visual Studio a fait pour moi pendant le débogage – KdgDev

-1

Pour C#, ce qui suit va faire ce que vous voulez -
1. Ouvrez une instance DirectoryInfo pour le directory où les fichiers existent
2. Obtenez tous les fichiers l'extension que vous voulez changer.
3. Modifiez l'extension de chaque fichier par eux.

3

En Lot vous pouvez effectuer les opérations suivantes:

@echo off 
setlocal enabledelayedexpansion enableextensions 
for %%f in (*.gif.png) do (
    set fn=%%f 
    set fn=!fn:.gif=! 
    ren "%%f" "!fn!" 
) 
endlocal 

Cela devrait fonctionner, au moins si les fichiers sont nommés .gif.png ... sinon, changer le filtre dans la déclaration for. Plus d'aide sur ce que vous pouvez faire avec des remplacements dans une déclaration set sont trouvés avec help set.

+0

Lors de l'exécution à partir du bon répertoire, DOS me dit ceci: La syntaxe de la commande est incorrecte. – KdgDev

+0

Cela a bien fonctionné pour moi ici. Vous devez le mettre dans un fichier batch, cependant. Il suffit de taper les commandes sur la ligne de commande ne fonctionnera pas. – Joey

1

Si vous souhaitez renommer tous les fichiers .png dans un dossier en .gif avec Java, je vous suggère de jeter un oeil à Apache Commons IO. La classe FileUtils fournit une méthode d'itération sur tous les fichiers avec une extension donnée ([iterateFiles] [3]) tandis que File lui-même fournit une méthode renameTo.

EDIT: Pour une raison quelconque, stackoverflow n'aime pas l'utilisation de la paranthesis dans le lien 3, vous devrez donc le copier et le coller manuellement. Je serais probablement aller pour l'approche par lots tho, comme Java est pas exactement votre premier choix pour les tâches administratives :)

[3]: http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#iterateFiles(java.io.File, java.lang.String [], Boolean)

+0

J'ai essayé sans succès de réparer le lien dans les parens J'ai ajouté un article d'uservoice pour cela http://stackoverflow.uservoice.com/pages/general/suggestions/146461-markdown-link-in-parens-text-1- – UnkwnTech

4

sur la ligne de commande:

(cela suppose qu'il n'y a pas de fichiers .gif)

REM first rename all .gif.png to .gif 
for %i in (*.gif.png) do ren %i %~ni 

REN then rename all .gif to .png 
for %i in (*.gif) do ren %~ni.gif %~ni.png 

utilisation pour/aide pour savoir ce que les options% votre version de Windows prend en charge.

Ce qui suit ne fonctionne pas avec .gif.png, désolé j'ai mal lu cette partie.

sur la ligne de commande (encore plus facile!):

s * .gif * .png

une version Java (fixée pour le .gif.png):

import java.io.File; 
import java.io.FilenameFilter; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main 
{ 
    public static void main(final String[] argv) 
    { 
     final File dir; 
     final File[] entries; 

     dir  = new File(argv[0]); 
     entries = dir.listFiles(new FilePatternFilter(".*\\.gif\\.png")); 

     for(final File entry : entries) 
     { 
      if(entry.isFile()) 
      { 
       final String path; 
       final String newPath; 
       final File newEntry; 

       path  = entry.getPath(); 
       newPath = path.substring(0, path.length() - "gif.png".length()) + "png"; 
       newEntry = new File(newPath); 

       if(!(entry.renameTo(newEntry))) 
       { 
        System.err.println("could not rename " + entry.getPath() + 
             " to " + newEntry.getPath()); 
       } 
      } 
     } 
    } 
} 
+0

+ 1 pour ren * .gif * .png. Tant de gens ne réalisent pas que c'est possible! –

+0

hmz, quelle est cette variable% ~ ni? Si ne peut pas le trouver en tapant "pour /?" Dans la DOSbox – KdgDev

+0

également, la commande batch n'a aucun effet. Rien ne se passe. Je l'ai exécuté à partir du répertoire où se trouvent les fichiers. Aussi, je ne sais pas grand-chose à propos de batch, mais en regardant votre code, il me semble que "fileName.gif" est dans "fileName.gif.png", et je cherche "fileName.gif.png" à " fileName.png " – KdgDev

0

Si vous pouvez utiliser C, vous pouvez utiliser le boost :: algorithim stringalgo bibliothèque et/ou boost :: regex si vous voulez vraiment un puissant moyen de fais ceci. Notez que l'utilisation des API Windows EDIT (ou équivalents linux) pour Move File, etc, sera beaucoup plus rapide, car ils créeront simplement de nouveaux liens sur le disque, plutôt que de copier les données, si cela est possible.