Переименование файлов таким же образом снова и снова - PullRequest
1 голос
/ 25 марта 2009

У меня была программа, работавшая над некоторыми моими изображениями, и она вернула их в мой каталог. Забавно, теперь все картинки в формате png вместо gif.

Сначала я подумал, что это было простое переименование, но я протестировал php с помощью createimagefrompng (), который выдаст ошибку, если изображение не является допустимым файлом png. Ошибки не возвращены.

В любом случае, это дает мне 100% точный результат, здесь не проблема, проблема в том, что я хочу переименовать все эти файлы аналогичным образом.

Теперь, когда я мог бы написать php-файл, чтобы сделать это для меня, мне интересно, как я мог бы сделать следующее в пакетном режиме или c # или java.

Все эти файлы все еще содержат строку ".gif", и я хочу удалить это. В php это будет так же просто, как использовать цикл foreach, читать файл, использовать str_replace, а затем уничтожать старый и писать новый.

Я как бы застрял в том, как бы я делал это в пакетном режиме, c # или java, может кто-нибудь помочь мне здесь?

Кроме того, я использую Windows Vista, и у меня установлен Powershell 1.0.

Решение 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);
  }
}

Ответы [ 6 ]

4 голосов
/ 25 марта 2009

в командной строке:

(предполагается, что нет файлов .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

Используйте для / help, чтобы узнать, какие опции% поддерживает ваша версия Windows.

Следующее не работает с .gif.png, извините, я неправильно прочитал эту часть.

в командной строке (еще проще!):

ren * .gif * .png

версия Java (исправлена ​​для .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());
                }
            }
        }
    }
}
3 голосов
/ 25 марта 2009

В пакетном режиме вы можете сделать следующее:

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

Это должно работать, по крайней мере, если файлы имеют имя .gif.png ... если нет, измените фильтр в операторе for. Дополнительные сведения о том, что можно сделать с заменами в операторе set, можно найти в help set.

1 голос
/ 25 марта 2009

Вы могли бы, вероятно, сделать что-то в такой степени в 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)));

или более просто ..

var files = Directory.GetFiles(@"c:\files", @"*.gif");
foreach (var file in files)
    File.Move(file, string.Format("{0}.gif", Path.GetFileNameWithoutExtension(file)));
1 голос
/ 25 марта 2009

Если вы хотите переименовать все файлы .png в папке в .gif с помощью Java, я бы посоветовал взглянуть на Apache Commons IO . Класс FileUtils предоставляет метод для перебора всех файлов с заданным расширением ([iterateFiles] [3]), а сам файл предоставляет метод renameTo .

РЕДАКТИРОВАТЬ : по какой-то причине в стеке потока не нравится использование парантеза в ссылке 3, поэтому вам придется скопировать и вставить его вручную. Я бы, вероятно, пошел на пакетный подход, так как Java не совсем ваш первый выбор для административных задач:)

[3]: http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#iterateFiles(java.io.File, java.lang.String [], логическое значение)

0 голосов
/ 25 марта 2009

Если вы можете использовать C, вы можете использовать библиотеку boost ::gorithim stringalgo и / или boost :: regex, если вам действительно нужен мощный способ сделать это. Обратите внимание, что использование EDIT (или эквивалентов Linux) для Move File и т. Д. Будет намного быстрее, поскольку они будут просто создавать новые жесткие ссылки на диске, а не копировать данные, если это возможно.

0 голосов
/ 25 марта 2009

Для C # следующее будет делать то, что вы хотите -
1. Откройте экземпляр DirectoryInfo для каталога , в котором находятся файлы.
2. Получить все файлы с расширением, которое вы хотите изменить.
3. Измените расширение каждого файла, переименовав их.

...