Pull to refresh

Comments 53

Кстати, файловые дескрипторы лучше закрывать в Finally

Спасибо, учту.
Ух ты, интересно, спасибо.
Вообще после открытия и чтения из него данных его лучше сразу закрывать. Одна строка, а сколько пользы.
я просто как раз начал закрывать после того как сделал по быстрому конвертер из 12 мегапикселей в 640х480, чтобы в пикасу фотки заливать.
когда у меня на паре открытых файлов программа отжирала ресурсов больше, чем броузер с полсотни вкладок.
еще, кстати, совет — подумайте про многопоточность ;) это как раз хороший пример на распаралеливание задач — в процессоре явно не один поток.
а будет обрабатываться быстрее.
и кстати, про рекурсивность прохода папок
Да, интересная задача для обучения :)
А для переименования файлов можно использовать:
Total Commander + Exif Plugin
Выбираем файлы, жмем Ctrl+M, задаем шаблон и вуаля
Хм… не знал, спасибо за инфу.
Например, используя шаблон:
[=exif.DateOriginal.Y-M-D] [=exif.TimeOriginal.h.m.s]
на выходе получаем имена:
2013-04-25 10.53.11.jpg, которые отлично сортируют фотографии по времени съёмки и позволяют по названию определить дату и время
В рамках фотосета время и дата сьёмки не так критичны, как для каталога, в котором эти файлы хранятся. Вы же не по файлам ищете, а по каталогу, нечто вроде d:\photo\2013-01-01 (Moscow) New Year AfterParty\Raw|Jpeg|etc\101.jpg
Тотал коммандер еще поставить надо — среди моих знакомых им пользуются единицы, в отличие от FAR'а, а .Net уже в системе.
да и опыт как программисту неплохой
А для макоси есть такая чудесная альтернатива?
Виндовым acdsee я вполне комфортно делал пакетное переименование с использованием exif информации. Маковская версия тоже должна уметь, по идее. Вообще, такое должен любой приличный фото-просмотрщик/редактор уметь делать, конечно.
ExifTool должен работать. Оттестировани и работает с exif от практически всех камер.
спасибо, забавно — ещё перловская штука.
UFO landed and left these words here
Да, можно и так. Но в этом случае возникает проблема когда с фотоаппарата файл не удалился, на компе имя уже другое и непонятно какие скопированы, а какие уже нет?
У меня с фотоаппарата фотографии удаляются при импорте Пикасой. Ну или руками Move делаю.
UFO landed and left these words here
Тогда переименовывать так, чтобы сохранялось и первоначальное имя файла. Я, когда переношу фотографии с фотоаппарата, имена файлов вообще не трогаю. А помещаю их в директорию, названную по схеме YYYY-MM-DD [название события].
Конечно, «в чужом глазу и сучок видишь, а в своем и бревна (порой) не замечаешь», но позволю себе пару замечаний по коду.

Перехват всех исключений — плохой подход.
catch (Exception)
{

}
К тому же из лога непонятно почему именно файл (и вообще какой файл) не открылся (то есть придется лезть в дебаггер).
Console.WriteLine(«Невозможно открыть файл»);

Вы уж определитесь в каком стиле именовать приватные переменные.
private DateTime creationTime;
private FileStream Foto;

И почему класс ReadExifInfo приватный? ;)

PS я понимаю, что программа написана «для себя». Но раз уж вы хотели потренироваться в разработке на c#, то, надеюсь, мои субъективные замечания будут полезны.
Да, спасибо за полезные замечания. По поводу «какой файл не открылся?» — это видно, так как выше есть строка
Console.WriteLine("Обрабатываем файл: {0}", fInf.Name);

По поводу именования, согласен, единый стиль не соблюдается.
В данном коде да, но эта строчка находится в другом классе (а не в ReadExifInfo). А это значит что класс «зависит» от кода «выше».
Да, с этой точки зрения, согласен.
>>>По поводу именования, согласен, единый стиль не соблюдается.

Если хочется поучиться, натравите StyleCop или поставьте resharper.
Используйте директиву using чтобы не писать Foto.Close два раза
Объявляйте переменные по месту первого использования.
Называйте нормальными словами
Спасибо за советы, попробую учесть.
Кусок кода

if (args.Length > 0)
{
if(args[0] == "/?") {
Console.WriteLine(«Изменение даты последней записи в файл на дату съемки»);
Console.WriteLine(«Использование: „);
Console.WriteLine(“ запуск без параметров — изменение в текущей папке»);
Console.WriteLine(" — изменение в указанной папке");
return;
}
if (Directory.Exists(args[0]))
{
jpgFilesInDir = Directory.EnumerateFiles(args[0], "*.jpg"); //получаем список файлов в указаной директории
}
else
{
Console.WriteLine(«Указанного пути не сущестует»);
return;
}
}
else
{
jpgFilesInDir = Directory.EnumerateFiles(curDir, "*.jpg"); //получаем список файлов в текущей директории
}

я бы вынес в отедльный метод. Или вообще сделал бы отдельный класс ArgumentsParser, который инкапсулирует логику разбора аргументов.
То есть было бы что-нибудь типа:

public class ArgumentsParser
{
public static Parse(string[] args)
{

return new DateToEXIFArguments(...);
}
}

public class DateToEXIFArguments
{
public string Directoty {get; private set;}

// конструктор
public DateToEXIFArguments(string directory)
{
Directoty = directory;
}
}

… и в методе Main:

static void Main(string[] args) {

var arguments = ArgumentsParser.Parse(args);
if(arguments!=null && !string.IsNullOrEmpty(arguments.Directory))
{
// используем каталог из аргументов
}
else
{
// используем текущий каталог
}
}

PS прошу прощение за неотформатированный код, хабр почему то не воспринимает мои теги *source lang=«cs»*
Да, согласен, такой подход более разумный с точки зрения повторного использования кода. Спасибо.
Могу поделиться неплохим парсером аргументов командной строки, когда-то нагугленным.
умеет как win так и unix-like style
т.е -blabla, --blabla, /blabla, при этом с разбором значений -blabla=100|«string»
Делитесь, конечно. Задача понятная и постоянно встречающаяся, но каждый раз кажется, что велосипед проще.
Выложил на SkyDrive тут sdrv.ms/17VRvHj
там неймспейс где это всё крутится и примеры использования в конце.
Если что, велосипед не мой, но работает как по мне неплохо.
Спасибо за инфу. Не знал, что возможность использования тегов зависит от кармы.
Японский городовой!
Дата вытаскивается при помощи exiv2, дата файла меняется при помощи touch. Получаем элементарнейший скриптик на баше (при желании даже однострочник).
Согласен коллега :)
У меня валяется скрипт для сортировки фоток по EXIF
#!/bin/sh 
BASEDIR="/share/photos" 
LIST=`find . -iname "*.jpg"` 
STRTIME="Image timestamp" 
 
for F in $LIST; do 
YEAR=`exiv2 "$F" | grep "${STRTIME}" | awk '{ print $4 }' | awk -F: '{ print $1 }'` 
MONTH=`exiv2 "$F" | grep "${STRTIME}" | awk '{ print $4 }' | awk -F: '{ print $2 }'` 
DAY=`exiv2 "$F" | grep "${STRTIME}" | awk '{ print $4 }' | awk -F: '{ print $3 }'` 
NAME=`basename "$F"` 
DIR="${BASEDIR}/${YEAR}/${MONTH}/$DAY" 
mkdir -p ${DIR} 
mv -f ${F} "${DIR}/${NAME}" 
done

Писано для себя, все устраивает
bash под виндой можно, не спорю, но штатный powershell тоже это умеет. как и остальную мощь .Net'а
Выше уже исключительно подробно раскрыта тема с Powershell'ом.
UFO landed and left these words here
Выводы:
1) (всем очевидно): мастдайка не пригодна для прикладного программирования (что вполне логично, т.к. мастдайка == прошивка игровых приставок);
2) (тоже очевидно): C# — непонятная приблуда, хуже баша!
Ну, тут не столько заслуга баша, сколько приложения exiv2…
под виндой запустить не пробовал, но на линуксе exiftool делает кучу всяких дел по инфе из exif
у меня фотографии раскладывает в каталоги по дате съемки и переименовывает с указанием даты и времени
имидж маджик тулзы можно вроде и под виндой, да. но я, как и автор, тоже преследую мысль о получении опыта в изучении ЯП, даже на таких самописных велосипедах
Под виндой тоже работает замечательно. Пользуюсь регулярно.
Жаль виндузятников. Не знают про exiftool, творящий чудеса.
совсем недавно писал нечто на эту тему на perl
#!perl
use 5.01;

my @filelist = glob("*");

@filelist = grep (/(jpg$|png$|gif$)/i, @filelist);

for (@filelist) {
	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime((stat($_))[9]);
	$year += 1900;
	$mon += 1;
	/(\.[^.]*)$/;
	my $name = sprintf "%4d-%02d-%02d_%02d%02d%02d%s",$year,$mon,$mday,$hour,$min,$sec,$1;
	say "$_ -> $name";
	
	rename $_, $name;
}


ExifTool тоже написан на perl, и его можно использовать в своих скриптах.
Если пользоваться FAR, то все даты/времена останутся в том же виде, а вот стандартный explorer (или же стандартная утилита импорта фотографий, когда фотоаппарат не подключается как диск) копирует как хочет, а хочет он сейчас.
Sign up to leave a comment.

Articles