ファイル日付を変更する

ファイルの日付を変更するtouchコマンドのGUIバージョンを作って見ました。

画面を以下に示します。操作方法は前回作ったファイルのリネームツールと同じでドラッグアンドドロップです。日付の入力にはNSDatePickerを使用します。

●独自Viewクラス

独自Viewクラスはリネームツールで作ったUCDropViewを流用します。

●日付の表現

NSDateには年月日時分秒の各要素にアクセスする手段がなく、いろいろ調べた結果NSDateComponentsというクラスがあって、これが日付を年月日時分秒等の要素で表現するクラスであることがわかりました。次にNSDateをNSDateComponentsに変換する手段ですが、調べたところNSCalendarのcomponents:fromDate:メソッドで行えることがわかりました。逆は同じくNSCalenderのdateFromComponents:メソッドで行えます。

●ファイル日付の更新

1つのファイル日付の更新を行うメソッドとして以下のメソッドを定義します。

// 日付変更処理
- (void)touchTheFile:(NSString *)strPath newDate:(NSDate *)oNewDate modifyHMS:(BOOL)bModifyHMS
{
	NSCalendar *oCal = [NSCalendar currentCalendar];
	NSFileManager *oFM = [NSFileManager defaultManager];

	NSDictionary *dicAttr = [oFM attributesOfItemAtPath:strPath error:NULL];
	NSDate *oModDate = [dicAttr objectForKey:NSFileModificationDate];
	NSDate *oCreDate = [dicAttr objectForKey:NSFileCreationDate];

	NSDateComponents *oNewDateComp, *oModDateComp, *oCreDateComp;
	NSUInteger nUnitFlg = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
	oNewDateComp = [oCal components:nUnitFlg fromDate:oNewDate];
	oModDateComp = [oCal components:nUnitFlg fromDate:oModDate];
	oCreDateComp = [oCal components:nUnitFlg fromDate:oCreDate];
	
	[oModDateComp setYear:[oNewDateComp year]];
	[oModDateComp setMonth:[oNewDateComp month]];
	[oModDateComp setDay:[oNewDateComp day]];
	if ( bModifyHMS == YES ) {
		[oModDateComp setHour:[oNewDateComp hour]];
		[oModDateComp setMinute:[oNewDateComp minute]];
		[oModDateComp setSecond:[oNewDateComp second]];
	}

	[oCreDateComp setYear:[oNewDateComp year]];
	[oCreDateComp setMonth:[oNewDateComp month]];
	[oCreDateComp setDay:[oNewDateComp day]];
	if ( bModifyHMS == YES ) {
		[oCreDateComp setHour:[oNewDateComp hour]];
		[oCreDateComp setMinute:[oNewDateComp minute]];
		[oCreDateComp setSecond:[oNewDateComp second]];
	}

	//NSLog( @"ModComp=%@\n", oModDateComp );
	//NSLog( @"CreComp=%@\n", oCreDateComp );
	oModDate = [oCal dateFromComponents:oModDateComp];
	oCreDate = [oCal dateFromComponents:oCreDateComp];
	
	NSDictionary *dicNewAttr = [NSDictionary dictionaryWithObjectsAndKeys:oModDate, NSFileModificationDate, oCreDate, NSFileCreationDate, nil];
	//NSLog( @"%@\n", dicNewAttr );
	
	NSError *oErr = nil;
	[oFM setAttributes:dicNewAttr ofItemAtPath:strPath error:&oErr];
	if ( oErr != nil ) {
		NSLog( @"%@\n", oErr );
	}
	
}

●ファイル日付更新スレッド

今回も処理中にキャンセルができるようにメインスレッドとは別スレッドで実行します。スレッドのコードは以下の通りです。

// 日付変更処理スレッド
- (void)touchThreadWithFiles:(id)arrFiles
{
	for ( NSString *strPath in arrFiles ) {
		if ( mbCanceled == YES ) {
			[self performSelectorOnMainThread:@selector(touchCanceled:)
								   withObject:nil
								waitUntilDone:YES];
			break;
		}
		
		NSDate *oNewDate = [outDatePick dateValue];
		[self touchTheFile:strPath newDate:oNewDate modifyHMS:mbModifyHMS];

		[self performSelectorOnMainThread:@selector(touchComplete:)
							   withObject:nil
							waitUntilDone:YES];
		
	}
}

サンプルプログラムのダウンロード(37KB)

【作成・確認環境】
MacOS X v10.6.4
Xcode v3.2.2

一覧に戻る