Comments 53
Писал похожее на PowerShell pastebin.com/dzztTAd2
Кстати, файловые дескрипторы лучше закрывать в Finally
Кстати, файловые дескрипторы лучше закрывать в Finally
Кстати, файловые дескрипторы лучше закрывать в Finally
Спасибо, учту.
Ух ты, интересно, спасибо.
Вообще после открытия и чтения из него данных его лучше сразу закрывать. Одна строка, а сколько пользы.
Тоже логично, спасибо.
я просто как раз начал закрывать после того как сделал по быстрому конвертер из 12 мегапикселей в 640х480, чтобы в пикасу фотки заливать.
когда у меня на паре открытых файлов программа отжирала ресурсов больше, чем броузер с полсотни вкладок.
еще, кстати, совет — подумайте про многопоточность ;) это как раз хороший пример на распаралеливание задач — в процессоре явно не один поток.
а будет обрабатываться быстрее.
и кстати, про рекурсивность прохода папок
когда у меня на паре открытых файлов программа отжирала ресурсов больше, чем броузер с полсотни вкладок.
еще, кстати, совет — подумайте про многопоточность ;) это как раз хороший пример на распаралеливание задач — в процессоре явно не один поток.
а будет обрабатываться быстрее.
и кстати, про рекурсивность прохода папок
есть poshcode.org специально для PowerShell
А для переименования файлов можно использовать:
Total Commander + Exif Plugin
Выбираем файлы, жмем Ctrl+M, задаем шаблон и вуаля
Total Commander + Exif Plugin
Выбираем файлы, жмем Ctrl+M, задаем шаблон и вуаля
Хм… не знал, спасибо за инфу.
Например, используя шаблон:
на выходе получаем имена:
[=exif.DateOriginal.Y-M-D] [=exif.TimeOriginal.h.m.s]
на выходе получаем имена:
2013-04-25 10.53.11.jpg
, которые отлично сортируют фотографии по времени съёмки и позволяют по названию определить дату и времяТотал коммандер еще поставить надо — среди моих знакомых им пользуются единицы, в отличие от FAR'а, а .Net уже в системе.
да и опыт как программисту неплохой
да и опыт как программисту неплохой
А для макоси есть такая чудесная альтернатива?
Да, можно и так. Но в этом случае возникает проблема когда с фотоаппарата файл не удалился, на компе имя уже другое и непонятно какие скопированы, а какие уже нет?
У меня с фотоаппарата фотографии удаляются при импорте Пикасой. Ну или руками Move делаю.
Тогда переименовывать так, чтобы сохранялось и первоначальное имя файла. Я, когда переношу фотографии с фотоаппарата, имена файлов вообще не трогаю. А помещаю их в директорию, названную по схеме YYYY-MM-DD [название события].
Конечно, «в чужом глазу и сучок видишь, а в своем и бревна (порой) не замечаешь», но позволю себе пару замечаний по коду.
Перехват всех исключений — плохой подход.
catch (Exception)
{
…
}
К тому же из лога непонятно почему именно файл (и вообще какой файл) не открылся (то есть придется лезть в дебаггер).
Console.WriteLine(«Невозможно открыть файл»);
Вы уж определитесь в каком стиле именовать приватные переменные.
private DateTime creationTime;
private FileStream Foto;
И почему класс ReadExifInfo приватный? ;)
PS я понимаю, что программа написана «для себя». Но раз уж вы хотели потренироваться в разработке на c#, то, надеюсь, мои субъективные замечания будут полезны.
Перехват всех исключений — плохой подход.
catch (Exception)
{
…
}
К тому же из лога непонятно почему именно файл (и вообще какой файл) не открылся (то есть придется лезть в дебаггер).
Console.WriteLine(«Невозможно открыть файл»);
Вы уж определитесь в каком стиле именовать приватные переменные.
private DateTime creationTime;
private FileStream Foto;
И почему класс ReadExifInfo приватный? ;)
PS я понимаю, что программа написана «для себя». Но раз уж вы хотели потренироваться в разработке на c#, то, надеюсь, мои субъективные замечания будут полезны.
Да, спасибо за полезные замечания. По поводу «какой файл не открылся?» — это видно, так как выше есть строка
По поводу именования, согласен, единый стиль не соблюдается.
Console.WriteLine("Обрабатываем файл: {0}", fInf.Name);
По поводу именования, согласен, единый стиль не соблюдается.
В данном коде да, но эта строчка находится в другом классе (а не в ReadExifInfo). А это значит что класс «зависит» от кода «выше».
>>>По поводу именования, согласен, единый стиль не соблюдается.
Если хочется поучиться, натравите StyleCop или поставьте resharper.
Используйте директиву using чтобы не писать Foto.Close два раза
Объявляйте переменные по месту первого использования.
Называйте нормальными словами
Если хочется поучиться, натравите 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»*
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»
умеет как win так и unix-like style
т.е -blabla, --blabla, /blabla, при этом с разбором значений -blabla=100|«string»
Делитесь, конечно. Задача понятная и постоянно встречающаяся, но каждый раз кажется, что велосипед проще.
Выложил на SkyDrive тут sdrv.ms/17VRvHj
там неймспейс где это всё крутится и примеры использования в конце.
Если что, велосипед не мой, но работает как по мне неплохо.
там неймспейс где это всё крутится и примеры использования в конце.
Если что, велосипед не мой, но работает как по мне неплохо.
У вас хурма отрицательная…
Японский городовой!
Дата вытаскивается при помощи exiv2, дата файла меняется при помощи touch. Получаем элементарнейший скриптик на баше (при желании даже однострочник).
Дата вытаскивается при помощи exiv2, дата файла меняется при помощи touch. Получаем элементарнейший скриптик на баше (при желании даже однострочник).
Согласен коллега :)
У меня валяется скрипт для сортировки фоток по EXIF
Писано для себя, все устраивает
У меня валяется скрипт для сортировки фоток по 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'а
под виндой запустить не пробовал, но на линуксе 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;
}
Если пользоваться FAR, то все даты/времена останутся в том же виде, а вот стандартный explorer (или же стандартная утилита импорта фотографий, когда фотоаппарат не подключается как диск) копирует как хочет, а хочет он сейчас.
Sign up to leave a comment.
Изменение даты файла согласно EXIF