问题描述
我正在尝试制作一个程序,使用元数据提取器 2.4.3 自动将图片从 SD 卡复制和排序到外部硬盘驱动器 我似乎没有发现任何问题,但每次运行代码时,都会提示一个未处理的异常。
错误如下:
Unhandled Exception: MetadataExtractor.ImageProcessingException: File format Could not be determined
at MetadataExtractor.ImageMetadataReader.ReadMetadata(Stream stream)
at MetadataExtractor.ImageMetadataReader.ReadMetadata(String filePath)
at file_sorter.File..ctor(String filepath) in
C:\Users\ropra\Documents\file_sorter\file_sorter\File.cs:line 27
at file_sorter.Program.Main(String[] args) in
C:\Users\ropra\Documents\file_sorter\file_sorter\Program.cs:line 27
代码如下:
Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MetadataExtractor;
namespace file_sorter
{
class Program
{
static void Main(string[] args)
{
// Define paths
string sandisk = @"Z:/Images/RAW";
string sd = @"Y:/DCIM/100_FUJI";
// Count elements in sd
string[] photoPaths = System.IO.Directory.GetFiles(sd);
Console.WriteLine("Counting elements in SD card...");
// Create object array
File[] photos = new File[photoPaths.Count()];
for (int i = 0; i < photos.Count(); i++)
{
photos[i] = new File(photoPaths[i]);
}
// Create tree and copy files
foreach (var item in photos)
{
string fileName = item.filename;
string sourcePath = item.sourcepath;
string targetPath = sandisk + "/" + item.year + "/" + item.month + "/" + item.day;
string sourceFile = System.IO.Path.Combine(sourcePath,fileName);
string destFile = System.IO.Path.Combine(targetPath,fileName);
Console.WriteLine("Now copying: {0} into {1}",fileName,targetPath);
System.IO.Directory.CreateDirectory(targetPath);
System.IO.File.copy(sourceFile,destFile,true);
}
}
}
}
文件.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MetadataExtractor;
namespace file_sorter
{
public class File
{
public string filename;
public string path;
public string year;
public string month;
public string day;
public string sourcepath;
public File(string filepath)
{
path = filepath;
filename = path.Substring(path.LastIndexOf("\\") + 1);
sourcepath = path.Substring(0,path.LastIndexOf("\\"));
string rawDate = "";
var Metadata = ImageMetadataReader.ReadMetadata(path);
for (int i = 0; i < Metadata.Count(); i++)
{
for (int j = 0; j < Metadata[i].TagCount; j++)
{
if (Metadata[i].Name == "Exif IFD0" && Metadata[i].Tags[j].Name == "Date/Time")
{
rawDate = Metadata[i].Tags[j].Description;
}
}
}
int separator = rawDate.IndexOf(":");
year = rawDate.Substring(0,separator);
string sub = rawDate.Substring(separator + 1);
separator = sub.IndexOf(":");
month = sub.Substring(0,separator);
sub = sub.Substring(separator + 1);
separator = sub.IndexOf(" ");
day = sub.Substring(0,separator);
}
public void ShowFormatedDate()
{
Console.WriteLine("Path: {0}",path);
Console.WriteLine("File: {0}",filename);
Console.WriteLine("Dir: {0}",sourcepath);
Console.WriteLine("Year: {0}",year);
Console.WriteLine("Month: {0}",month);
Console.WriteLine("Day: {0}",day);
Console.WriteLine("");
}
}
}
提前致谢。
解决方法
好的,因此放弃并手动整理所有文件后,我遇到了一个 .xml 文件,其中包含单个 .RAF 文件的元数据,我猜是我的相机把它放在那里。
此程序不处理 MetadataExtractor 不受支持的文件,因此存在问题。
,ImageProcessingException:无法确定文件格式
这个异常意味着库没有将它提供的文件识别为它知道如何读取的任何东西。例如,如果您将文本文件提供给库,您将看到此异常。
也许您可以捕获此异常类型并为此类文件使用不同的代码路径。