2009-03-24 3 views
1

У меня была работа над некоторыми изображениями, и я вернул их в свой каталог. Смешные вещи, теперь они все 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); 
    } 
} 
+0

Вы должны сначала убедиться, что если вы вручную попытаетесь изменить имя на gif, они не сломаются. Возможно, программа конвертировала ваши файлы. – jjnguy

+0

Я думаю, что вы не понимаете: программа hasready превратила мои файлы в .png-файлы. Это расширение, а «.gif» до этого будет считаться частью имени файла операционной системой. Поэтому я хочу удалить эту часть имени файла. – KdgDev

+0

какую версию Windows вы используете? – TofuBeer

ответ

1

Вы могли бы сделать что-то в той степени, следующих в 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))); 
+0

var files = Directory.GetFiles (@ "c: \ files ", @" *. gif "); работает так же, как без создания экземпляра DirectoryInfo. – Lucas

+0

На самом деле, все начинки в настоящее время выглядят так: «filename.gif.png». И я хочу изменить их на "filename.png". Но с вашим намеком, я думаю, что смогу это сделать. – KdgDev

+0

На самом деле, здесь что-то может пойти не так. Функция File.Move() требует, чтобы новый путь был абсолютным. Таким образом, просто добавив «filename.png», поскольку новое местоположение будет выбрасывать и IOException, по крайней мере, это то, что Visual Studio сделала для меня во время отладки. – KdgDev

-1

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

3

В Batch вы можете сделать следующее:

@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.

+0

При выполнении этого из правильного каталога dos сообщает мне следующее: Синтаксис команды неверен. – KdgDev

+0

Для меня это работало отлично. Однако вы должны поместить его в пакетный файл. Простое написание команд в командной строке не будет работать. – Joey

1

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

EDIT: По какой-то причине stackoverflow не любит использование paranthesis в ссылке 3, поэтому вам придется копировать и вставлять его вручную. Я бы, вероятно, пойти на пакетный подход Тхо, так как Java не совсем ваш первый выбор для решения административных задач :)

[3]: http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#iterateFiles(java.io.File, java.lang.String [], булево)

+0

Я неуспешно пытался исправить ссылку в parens Я добавил элемент пользовательского доступа для нее http://stackoverflow.uservoice.com/pages/general/suggestions/146461-markdown-link-in-parens-text-1- – UnkwnTech

4

на Командная строка:

(это предполагает, что нет .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 

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

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

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

жэни * .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()); 
       } 
      } 
     } 
    } 
} 
+0

+ 1 для ren * .gif * .png. Так много людей не понимают, что это возможно! –

+0

hmz, что это за переменная% ~ ni? Если не удается найти его при вводе «для /?» в DOSbox – KdgDev

+0

также командная команда не действует. Ничего не произошло. Я выполнил его из каталога, где находятся файлы. Кроме того, я не так много знаю о пакете, но, глядя на ваш код, кажется «fileName.gif» в «fileName.gif.png», и я ищу «fileName.gif.png» для « fileName.png " – KdgDev

0

Если вы можете использовать C, вы можете использовать повышение :: algorithim stringalgo библиотеки и/или повышение :: регулярное выражение, если вы действительно хотите мощный путь к сделай это. Обратите внимание, что использование EDIT для Windows API (или linux-эквивалентов) для Move File и т. Д. Будет намного быстрее, потому что они просто будут создавать новые жесткие ссылки на диске, а не копировать данные, если это возможно.

Смежные вопросы