Foundation(ファイル管理)

2010. 04. 11
●ファイルハンドル

通信用語の基礎知識/ファイルハンドル』によると、ファイルハンドルは『OSがどのファイルかを識別するための情報』とあり、OSによって異なるとあります。

iPhone OSの場合、ファイルを取り扱うクラスはいくつかあるのですが、ここで紹介するNSFileHandleクラスの場合は『Introduction to Low-Level File Management Programming Topics』を見ると、ファイルを開いたり通信チャンネルにアクセスするラッパーを提供するクラスとなっています。

NSFileHandleの特徴は

・読み書きにおいて精密な位置をポインタで与え、ファイル内の検索や、範囲を指定して切り取りや挿入を行うなど、ファイルの入出力操作を細かく制御できます。
(他のメソッドではファイル全体に対する操作になります)

・適用範囲はファイルに限定されず、ソケットやパイプ、デバイスの通信チャンネルに対して読み書きできます。

・非同期バックグラウンド通信が可能で、個々のスレッドでソケットとの接続、読み取りができます

またファイル記述子(ファイルディスクリプタ)はファイルハンドルより下位の識別情報で、詳細は『IT用語辞典/ファイルディスクリプタ』や『Wikipedia/ファイル記述子』を参照してください


●ファイル管理のクラス図

Foundation
NSFileHandle
NSFileManager


// 書き込み用ファイルを開く
NSFileHandle *wtFile = [NSFileHandle fileHandleForWritingAtPath:@"/Users/yayoi/Desktop/yayoi.txt"];

// 書き込むデータの準備
char wtBuf[72] = "タレがあってアメがあって タニシができれぅ~♪";

// データの書き込み
NSData *wtData = [NSData dataWithBytes:wtBuf length:sizeof(wtBuf)];
[wtFile writeData:wtData];

// ファイルを閉じる
[wtFile closeFile];

// 読み込み用ファイルを開く
NSFileHandle *rdFile = [NSFileHandle fileHandleForReadingAtPath:@"/Users/yayoi/Desktop/yayoi.txt"];

// データの読み込み
NSData *rdData = [rdFile readDataOfLength:72];

// ファイルを閉じる
[rdFile closeFile];

// データの出力
NSString *rdString = [[NSString alloc] initWithData:rdData encoding:NSUTF8StringEncoding];
NSLog([NSString stringWithFormat:@"%@", rdString]); 

※ 空ファイルでいいので当該パスにファイルを置いておかないとファイルが開けません
(ファイルが無いからといって新規作成はしません)


・fileHandleForWritingAtPath:

+ (id)fileHandleForWritingToPath:(NSString *)path

書き込み用として、指定したパスにあるファイルやデバイス、または名付けたソケットのファイルハンドルを初期化して返します

指定したパスにファイルが無い場合はnilを返します

ポインタはファイルの先頭に設定されます
返されるオブジェクトはwriteData:のみ応答できます

path:アクセスするファイルやデバイス、または名付けたソケットへのパスを指定します


・dataWithBytes:length:

+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length

指定した長さのバイト数をバッファからコピーし、格納したデータオブジェクトを作成して返します

データオブジェクトが作成できなかった場合はnilを返します

bytes:コピーするデータの入ったバッファを指定します

length:バッファからコピーするバイト数を指定します
バッファのサイズを超える長さを指定してはいけません


・writeData:

- (void)writeData:(NSData *)data

指定したデータをファイル、デバイス、パイプまたはソケットに書き込みます

ファイルの場合、現在のポインタの位置からデータを書き込みます
データを書き込んだ後、書き込んだバイト数の分ファイルのポインタを移動します
ファイル記述子が閉じていたり、有効でなかったり、レシーバがパイプやソケットのエンドポイントを示していたり、ファイルシステムに空き領域が無かったり、その他書き込みエラーがあった場合は例外を発生させます

data:書き込み用データを指定します


・closeFile

- (void)closeFile

書き込み用として接続しているファイルや通信チャンネルとのアクセスを切断します

ファイルや通信チャンネルを使い終わったら、ファイルハンドルにレシーバを閉じる指示を出します
closeFileで閉じたファイルに読み込みしようとすると例外が発生します


・fileHandleForReadingAtPath:

+ (id)fileHandleForReadingAtPath:(NSString *)path

読み込み用として、指定したパスにあるファイルやデバイス、または名付けたソケットのファイルハンドルを初期化して返します

指定したパスにファイルが無い場合はnilを返します

ポインタはファイルの先頭に設定されます
返されるオブジェクトはNSFileHandleクラスの『read~』メソッドのみ応答できます

path:アクセスするファイルやデバイス、または名付けたソケットへのパスを指定します


・readDataOfLength:

- (NSData *)readDataOfLength:(NSUInteger)length

指定した長さのバイト数のデータをレシーバから読み込みます

ファイルの場合、ポインタから指定した長さかファイル終端の、どちらか早い方が検出された分を読み込みます
ポインタがファイルの終端であったり、通信チャンネルがファイルの終端を示している場合は、空のNSDataを返します
ファイルハンドルの型が特定できない、またはファイルやチャンネルが読み込めなかった場合は、NSFileHandleOperationExceptionを発生させます

length:レシーバから読み込むバイト数を指定します

// NSFileManagerのインスタンスを取得
NSFileManager *fileMgr = [NSFileManager defaultManager];

// ディレクトリのパスを指定
NSString * dirPath = @"/Users/yayoi/Desktop";

// ディレクトリが含むファイルの一覧を取得
NSError *pathError;
NSArray *cntArray = [fileMgr contentsOfDirectoryAtPath:dirPath error:&pathError];

for (NSString *subPath in cntArray) {

    // ファイルのフルパスを作成
    NSString *fullPath = [dirPath stringByAppendingPathComponent:subPath];

    // ファイルに対する処理を実行
    NSLog([NSString stringWithFormat:@"%@", fullPath]); 
}

/* 出力結果
/Users/yayoi/Desktop/.DS_Store
/Users/yayoi/Desktop/.localized
/Users/yayoi/Desktop/yayoi.txt
*/

新版の『iPhone SDK 3 プログラミング大全』では修正されているのかもしれませんが、手元の旧版(第1版第2刷)ではcontentsOfDirectoryAtPath:error:メソッドの引数『error』の記述が有りませんでした。


・defaultManager

+ (NSFileManager *)defaultManager

ファイルシステムのデフォルトNSFileManagerオブジェクトを返します

常にファイルマネージャの同じインスタンスを返します
このオブジェクトはスレッドセーフではありません


・contentsOfDirectoryAtPath:error:

- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error

指定したディレクトリに含まれるディレクトリとファイル(シンボリックリンクを含む)を返します

指定したパスに何も無かった場合は空の配列を返します
指定したパスが存在しない、または他のアクセスエラーが発生した場合はnilを返します

検索は浅く、サブディレクトリ下の内容は返しません
返される配列には、カレントディレクトリの『"."』、親ディレクトリの『".."』、『"._"』で始まるリソースフォーク、シンボリックリンクの参照先は含みません

※ シンボリックリンクは『NSString(7)/– stringByStandardizingPath』を参照してください

path:取得するディレクトリのパスを指定します

error:エラーが発生した場合、その説明をNSErrorオブジェクトに格納します
エラー情報を取得しない場合はNULLを指定します


・– stringByAppendingPathComponent:

– (NSString *)stringByAppendingPathComponent:(NSString *)aString

レシーバの文字列に指定した文字列を追加した新規の文字列を返します

パスの区切り文字『/』は必要に応じて付与します

aString:パスに追加する文字列を指定します

aStringを"scratch.tiff"にした場合の、戻り値の例を下表に示します

レシーバの文字列戻り値の文字列
"/tmp""/tmp/scratch.tiff"
"/tmp/""/tmp/scratch.tiff"
"/""/scratch.tiff"
""(空の文字列)"scratch.tiff"

このメソッドはファイルパスに対してのみ使用してください(URLなどで使わないこと)



参考文献

NSFileHandle Class Reference

NSData Class Reference

NSFileManager Class Reference

NSString Class Reference

IT用語辞典/ファイルディスクリプタ

Wikipedia/ファイル記述子

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)
(2009/09/08)
木下 誠

商品詳細を見る

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る






Wave SoundTouch music system IV
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Wave SoundTouch music system IV
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR