ReadOnlyボリュームのチェックプログラム

現在使っているiMacにバックアップ用外付けディスクを接続しているのですが、何が悪いのか時々読み込み専用でマウントされることがあります。そしてたちが悪いことにバックアップソフトを走らせて差分チェックを行った後にいざファイルの書き込みに行ってエラーになってようやく発覚。ディスクユーティリティでアンマウント/マウントを行えば書き込み可能になるのですが、差分チェックにはかなり時間がかかるのでもう一度実行するのかと思うとがっかり。そこで現在マウントされているディスクが読み込み専用になっているかの一覧を表示するプログラムを作りました。(以下の画面参照)

ディスクの情報を取得するAPIを調べて見ると、意外なことにNSURLの以下のメソッドで取得できることがわかりました。

getResourceValue:forKey:error:

Cocoa Bindingを使用するためにモデルクラスとして以下のクラスを作成。getResourceValue:forKey:error:のキーとしてディスクの表示名(NSURLVolumeLocalizedNameKey)と読み込み専用であるかのフラグ(NSURLVolumeIsReadOnlyKey)を指定して必要な情報を取得しています。

UCVolumeInfo.h:ボリューム情報クラスインターフェース
#import 

@interface UCVolumeInfo : NSObject

@property (copy) NSString	*volumePath;
@property (copy) NSString	*volumeName;
@property (copy) NSString	*readOnly;

// Initializer
- (id)initWithVolumePath:(NSString *)paramVolumePath;

@end

UCVolumeInfo.m:ボリューム情報クラスインプリメント
#import "UCVolumeInfo.h"

@implementation UCVolumeInfo

@synthesize volumePath;
@synthesize volumeName;
@synthesize readOnly;

// Initializer
- (id)initWithVolumePath:(NSString *)paramVolumePath {
	NSString	*strValue;
	NSNumber	*numValue;
	NSURL		*volumeURL;
	NSError		*err;

	if ( self = [super init] ) {
		self.volumePath = paramVolumePath;
		volumeURL = [NSURL fileURLWithPath:self.volumePath];
		[volumeURL getResourceValue:&strValue forKey:NSURLVolumeLocalizedNameKey error:&err];
		self.volumeName = strValue;
		[volumeURL getResourceValue:&numValue forKey:NSURLVolumeIsReadOnlyKey error:&err];
		self.readOnly = ([numValue boolValue] == YES) ? @"YES" : @"NO";
	}

	return self;
}

@end

ディスク情報の一覧を作成するメソッドのソースは以下の通りです。

static NSString * const		VOLUME_PREFIX = @"/Volumes";

- (void)enumerateVolumesInfo {
	UCUtils			*utils = [UCUtils sharedUtils];
	NSFileManager	*fm = [NSFileManager defaultManager];
	NSArray			*items;
	NSError			*err;
	NSString		*volumePath;
	UCVolumeInfo	*volumeInfo;

	self.volumes = [[NSMutableArray alloc] init];
	items = [fm contentsOfDirectoryAtPath:VOLUME_PREFIX error:&err];
	if ( items == nil ) {
		[utils showAlertWithMessage:[NSString stringWithFormat:NSLocalizedString( @"UCAppDelegateCanNotAccessVolumePath", nil ), VOLUME_PREFIX, err] level:ALERT_LEVEL_ERROR window:_window];
		return;
	}

	for ( NSString *item in items ) {
		if ( [item characterAtIndex:0] == '.' ) continue;
		volumePath = [VOLUME_PREFIX stringByAppendingPathComponent:item];
		volumeInfo = [[UCVolumeInfo alloc] initWithVolumePath:volumePath];
		if ( volumeInfo == nil ) {
			[utils showAlertWithMessage:[NSString stringWithFormat:NSLocalizedString( @"UCAppDelegateCanNotGetVolumeInfo", nil ), volumePath] level:ALERT_LEVEL_ERROR window:_window];
			return;
		}
		[self.volumes addObject:volumeInfo];
	}

	[_outArrayController rearrangeObjects];
}

プロジェクトファイルのダウンロード

【作成・確認環境】
Mac OS X v10.8.4
Xcode v4.6.8

一覧に戻る