问题描述
主程序:usingSystem;usingSystem.Collections.Generic;usingSystem.Windows.Forms;usingSystem.IO;namespacePhoto_name_change_tool{publicpartialclassForm1:Form{publicList<string>FilesName=newList<string>();publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){FolderBrowserDialogFilesPathDialog=newFolderBrowserDialog();FilesPathDialog.Description="BrowsePhotoFilesPath:";if(FilesPathDialog.ShowDialog()==DialogResult.OK){stringFilesPath=FilesPathDialog.SelectedPath;textBox1.Text=FilesPath;ScanPhotoFiles(FilesPath);}}privatevoidScanPhotoFiles(stringFilesPath){FilesName.Clear();DirectoryInfoFilesFolder=newDirectoryInfo(FilesPath);for(inti=0;i<FilesFolder.GetFiles().Length;i++){if(FilesFolder.GetFiles()[i].Length>0&&FilesFolder.GetFiles()[i].Extension==".jpg"){ListViewItemlvi=newListViewItem();lvi.Text=(i+1).ToString();lvi.SubItems.Add(FilesFolder.GetFiles()[i].Name);lvi.SubItems.Add("-");lvi.SubItems.Add("-");lvi.SubItems.Add("-");listView1.Items.Add(lvi);FilesName.Add(FilesFolder.GetFiles()[i].Name);}}ChangePhotoFilesName();}privatevoidChangePhotoFilesName(){for(inti=0;i!=FilesName.Count;i++){Exif.Picturexifem=newExif.Picturexif();Exif.Picturexif.Metadatam=em.GetEXIFMetaData(textBox1.Text+@""+FilesName[i]);//获取EXIF照片拍摄时间if(m.DatePictureTaken.DisplayValue!=null){listView1.Items[i].SubItems[2].Text=m.DatePictureTaken.DisplayValue;}else{listView1.Items[i].SubItems[2].Text="-";}//更改文件名为EXIF照片拍摄时间if(listView1.Items[i].SubItems[2].Text!="-"){stringTargetName=listView1.Items[i].SubItems[2].Text.ToString();TargetName=TargetName.Replace(":","");TargetName=TargetName.Replace("","_");listView1.Items[i].SubItems[3].Text=TargetName+".jpg";if(listView1.Items[i].SubItems[1].Text!=listView1.Items[i].SubItems[3].Text){//File.Move(textBox1.Text+@""+listView1.Items[i].SubItems[1].Text,textBox1.Text+@""+listView1.Items[i].SubItems[3].Text);listView1.Items[i].SubItems[4].Text="Successful";}}}}}}
Exif类参照:http://www.cnblogs.com/yeminglong/p/3172719.html问题出在listView1.Items[i].SubItems[2].Text=m.DatePictureTaken.DisplayValue;listView1.Items[i].SubItems[3].Text=TargetName+".jpg";没有后面的.jpg且File.Move(textBox1.Text+@""+listView1.Items[i].SubItems[1].Text,textBox1.Text+@""+listView1.Items[i].SubItems[3].Text);提示路径中有非法字符求解,显示都是正常的,为啥就是无法拼接这个字符串,为啥更改文件名会出现路径非法。感谢!
解决方案
解决方案二:
那你倒把路径发出来看看啊,简单的验证方法就是把得到路径直接在文件夹地址栏里运行下,如果报错那肯定是你的问题
解决方案三:
引用1楼xdashewan的回复:
那你倒把路径发出来看看啊,简单的验证方法就是把得到路径直接在文件夹地址栏里运行下,如果报错那肯定是你的问题
路径C:UsersAirDesktop新建文件夹源文件名:C:UsersAirDesktop新建文件夹1.jpg新文件名:C:UsersAirDesktop新建文件夹20150301_135212.jpgMessageBox显示出来也正常,但执行时就报错。相当诡异。
解决方案四:
已将项目压缩上传至临时服务器:http://dev.airsky.cc/csdn_16615.rar求解析。
解决方案五:
不知道你这字段怎么输出出来的ListViewItemlvi=newListViewItem();lvi.Text=(i+1).ToString();lvi.SubItems.Add(FilesFolder.GetFiles()[i].Name);lvi.SubItems.Add("-");lvi.SubItems.Add("-");lvi.SubItems.Add("-");
File.Move(textBox1.Text+@""+listView1.Items[i].SubItems[1].Text,textBox1.Text+@""+listView1.Items[i].SubItems[3].Text);
光看这两段代码,我可以说listView1.Items[i].SubItems[1]里绝对没有文件名
解决方案六:
引用4楼xdashewan的回复:
不知道你这字段怎么输出出来的ListViewItemlvi=newListViewItem();lvi.Text=(i+1).ToString();lvi.SubItems.Add(FilesFolder.GetFiles()[i].Name);lvi.SubItems.Add("-");lvi.SubItems.Add("-");lvi.SubItems.Add("-");File.Move(textBox1.Text+@""+listView1.Items[i].SubItems[1].Text,textBox1.Text+@""+listView1.Items[i].SubItems[3].Text);
光看这两段代码,我可以说listView1.Items[i].SubItems[1]里绝对没有文件名
里面是有文件名的,上面有遍历。如果可以的话,希望看下我上传的项目。非常感谢!
解决方案七:
引用5楼x_airsky的回复:
里面是有文件名的,上面有遍历。如果可以的话,希望看下我上传的项目。非常感谢!
我当然看了遍历了,但你的遍历里除了一个判断,其余没有任何对SubItems[1]的操作for(inti=0;i!=FilesName.Count;i++){Exif.Picturexifem=newExif.Picturexif();Exif.Picturexif.Metadatam=em.GetEXIFMetaData(textBox1.Text+@""+FilesName[i]);//获取EXIF照片拍摄时间if(m.DatePictureTaken.DisplayValue!=null){listView1.Items[i].SubItems[2].Text=m.DatePictureTaken.DisplayValue;}else{listView1.Items[i].SubItems[2].Text="-";}//更改文件名为EXIF照片拍摄时间if(listView1.Items[i].SubItems[2].Text!="-"){stringTargetName=listView1.Items[i].SubItems[2].Text.ToString();TargetName=TargetName.Replace(":","");TargetName=TargetName.Replace("","_");listView1.Items[i].SubItems[3].Text=TargetName+".jpg";if(listView1.Items[i].SubItems[1].Text!=listView1.Items[i].SubItems[3].Text){//File.Move(textBox1.Text+@""+listView1.Items[i].SubItems[1].Text,textBox1.Text+@""+listView1.Items[i].SubItems[3].Text);listView1.Items[i].SubItems[4].Text="Successful";}}}
解决方案八:
引用6楼xdashewan的回复:
Quote: 引用5楼x_airsky的回复:
里面是有文件名的,上面有遍历。如果可以的话,希望看下我上传的项目。非常感谢!我当然看了遍历了,但你的遍历里除了一个判断,其余没有任何对SubItems[1]的操作for(inti=0;i!=FilesName.Count;i++){Exif.Picturexifem=newExif.Picturexif();Exif.Picturexif.Metadatam=em.GetEXIFMetaData(textBox1.Text+@""+FilesName[i]);//获取EXIF照片拍摄时间if(m.DatePictureTaken.DisplayValue!=null){listView1.Items[i].SubItems[2].Text=m.DatePictureTaken.DisplayValue;}else{listView1.Items[i].SubItems[2].Text="-";}//更改文件名为EXIF照片拍摄时间if(listView1.Items[i].SubItems[2].Text!="-"){stringTargetName=listView1.Items[i].SubItems[2].Text.ToString();TargetName=TargetName.Replace(":","");TargetName=TargetName.Replace("","_");listView1.Items[i].SubItems[3].Text=TargetName+".jpg";if(listView1.Items[i].SubItems[1].Text!=listView1.Items[i].SubItems[3].Text){//File.Move(textBox1.Text+@""+listView1.Items[i].SubItems[1].Text,textBox1.Text+@""+listView1.Items[i].SubItems[3].Text);listView1.Items[i].SubItems[4].Text="Successful";}}}
但编译后确实有内容,且把move后面的新文件名改为i.tstring()+".jpg"是可以执行更改文件名的。
解决方案九:
引用7楼x_airsky的回复:
但编译后确实有内容,且把move后面的新文件名改为i.tstring()+".jpg"是可以执行更改文件名的。
断点调试下
解决方案十:
引用8楼xdashewan的回复:
Quote: 引用7楼x_airsky的回复:
但编译后确实有内容,且把move后面的新文件名改为i.tstring()+".jpg"是可以执行更改文件名的。断点调试下
调试也看不懂到底为什么出错..==大神可以帮忙看下咩。。
解决方案十一:
稍微改动了下代码,你试着看看,能否看明白1、listview中的每个item应该都有一个文件名对吧,所以用foreach循环lv.Items可能方便一点2、displayValue应该是日期时间,所以可以先转换为datetiem,下面可以直接使用了3、格式化datetime类型的数据就不用拼接字符串了4、system.io.path中有几个静态方法很好用的,比如组合路径string[]fileNames=newstring[0];ListViewlv=newListView();TextBoxtextBox1=newTextBox();foreach(ListViewItemiteminlv.Items){//Exif.Picturexifem=newExif.Picturexif();//Exif.Picturexif.Metadatam=em.GetEXIFMetaData(textBox1.Text+@""+fileNames[i]);vardir=textBox1.Text;varfileName=item.SubItems[1].Text;vardisplayValue=default(object);//没有对象,你懂的vardate=DateTime.Now;varhasValue=DateTime.TryParse(displayValue?.ToString(),outdate);//获取EXIF照片拍摄时间if(hasValue){item.SubItems[2].Text=string.Format("{0:yyyy/MM/ddHH:mm:ss",date);//更改文件名为EXIF照片拍摄时间stringtarget=string.Format("{0:yyyyMMdd_HHmmss}.jpg",date);item.SubItems[3].Text=target;if(fileName!=target){varoldPath=System.IO.Path.Combine(dir,fileName);varnewPath=System.IO.Path.Combine(dir,target);//File.Move(textBox1.Text+@""+listView1.Items[i].SubItems[1].Text,textBox1.Text+@""+listView1.Items[i].SubItems[3].Text);item.SubItems[4].Text="Successful";}}else{item.SubItems[2].Text="-";}}
解决方案十二:
引用10楼qqamoon的回复:
稍微改动了下代码,你试着看看,能否看明白1、listview中的每个item应该都有一个文件名对吧,所以用foreach循环lv.Items可能方便一点2、displayValue应该是日期时间,所以可以先转换为datetiem,下面可以直接使用了3、格式化datetime类型的数据就不用拼接字符串了4、system.io.path中有几个静态方法很好用的,比如组合路径string[]fileNames=newstring[0];ListViewlv=newListView();TextBoxtextBox1=newTextBox();foreach(ListViewItemiteminlv.Items){//Exif.Picturexifem=newExif.Picturexif();//Exif.Picturexif.Metadatam=em.GetEXIFMetaData(textBox1.Text+@""+fileNames[i]);vardir=textBox1.Text;varfileName=item.SubItems[1].Text;vardisplayValue=default(object);//没有对象,你懂的vardate=DateTime.Now;varhasValue=DateTime.TryParse(displayValue?.ToString(),outdate);//获取EXIF照片拍摄时间if(hasValue){item.SubItems[2].Text=string.Format("{0:yyyy/MM/ddHH:mm:ss",date);//更改文件名为EXIF照片拍摄时间stringtarget=string.Format("{0:yyyyMMdd_HHmmss}.jpg",date);item.SubItems[3].Text=target;if(fileName!=target){varoldPath=System.IO.Path.Combine(dir,fileName);varnewPath=System.IO.Path.Combine(dir,target);//File.Move(textBox1.Text+@""+listView1.Items[i].SubItems[1].Text,textBox1.Text+@""+listView1.Items[i].SubItems[3].Text);item.SubItems[4].Text="Successful";}}else{item.SubItems[2].Text="-";}}
感谢指导!但似乎varhasValue=DateTime.TryParse(displayValue?.ToString(),outdate);无法转换为DateTime型所有都返回False
解决方案十三:
引用11楼x_airsky的回复:
varhasValue=DateTime.TryParse(displayValue?.ToString(),outdate);无法转换为DateTime型所有都返回False
DateTime.TryParse方法尝试转换一个日期时间,成功则返回true,且date参数包含转换后的值,否则返回false,date貌似=DateTime.MinValue