広告
PRサイト
関連サイト

ファイルを保存する場所を確保する

ファイルを保存する場所はライブラリフォルダにします。ここにRepeating Motif Saverという名前のフォルダを作って、この中に保存する事にします。まずはライブラリフォルダのパスを入手します。

インターフェイスファイルの変更

このフォルダのパスを覚えておくためのインスタンス変数を追加します。

RepeatingMotifSaverView.h
@interface RepeatingMotifSaverView : ScreenSaverView 
{
    IBOutlet id     optionWindow;
    IBOutlet id     randomizer,generator,repeatingMotif;
    IBOutlet id     optionWindowTabView;
    
    BOOL            fixToLayerMax;
    int             counter,transition,hold,layerMax;
    int             selectedIndex;

    NSImage         *image;
    NSString        *directory;
    NSMutableArray  *masterMotifs,*repeatingMotifs;
}

- (IBAction)closeOptionWindow:(id)sender;

@end


ライブラリフォルダのパスを保存する

初期化メソッドでライブラリフォルダのパスを変数に保存して、deallocメソッドでreleaseします。

ファイルを保存するフォルダのパスを設定するコードは以下の様になるのですが、ここで使っている関数については次の項目「特別なフォルダのパスを手に入れる方法」で説明しているので、そちらを読んで下さい。

RepeatingMotifSaverView.m
NSString    *RMSDirectoryName       = @"Repeating Motif Saver";

@implementation RepeatingMotifSaverView

- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
    self = [super initWithFrame:frame isPreview:isPreview];
    if(self)
    {
        ScreenSaverDefaults *ssd = [ScreenSaverDefaults
            defaultsForModuleWithName:RMSModuleName];
        NSArray         *paths = NSSearchPathForDirectoriesInDomains(
            NSLibraryDirectory, NSUserDomainMask, YES);
        
        [self setAnimationTimeInterval:1/10.0];
        [NSBundle loadNibNamed:RMSResourceName owner:self];
        transition      = [ssd integerForKey:@"transition"];
        hold            = [ssd integerForKey:@"hold"];
        layerMax        = [ssd integerForKey:@"layerMax"];
        fixToLayerMax   = [ssd boolForKey:@"fixToLayerMax"];
        selectedIndex   = [ssd integerForKey:@"selectedIndex"];

        masterMotifs = repeatingMotifs = nil;
        directory = [[NSString stringWithFormat:@"%@/%@",
            [paths objectAtIndex:0], RMSDirectoryName] retain];
    }
    return self;
}

- (void)dealloc
{
    [directory release];
    [super dealloc];
}

特別なフォルダのパスを手に入れる方法

ライブラリフォルダのパスを手に入れるにはNSSearchPathForDirectoriesInDomains関数を使います。

NSArray *NSSearchPathForDirectoriesInDomains (NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)

directoryにはNSPathUtilities.hで定義されている定数を指定します。例えばNSApplicationDirectoryやNSDesktopDirectoryといったものがあります。今回はライブラリフォルダが欲しいのでNSLibraryDirectoryを指定します。

domainMaskにはどこを探すのかを指定する定数を指定します。例えばユーザのホームディレクトリを探す場合はNSUserDomainMask、システムディレクトリを探す場合はNSSystemDomainMaskを指定します。

expandTildeは~を展開するかどうかを指定するフラグです。NSDataのwriteToFile:atomically:メソッドを使ってファイルに書き込む際に展開しておかないといけないので、YESを指定します。

返り値の配列の中にパスが入っています。複数の場所を探す様に指定した場合は、複数の値が返ってくるので返り値が配列になっているものと思われます。


ディレクトリがなければ作る

Repeating Motif Saverという名前のフォルダ(ディレクトリ)がなければ作るという処理を追加します。これにはNSFileManagerを使います。使うのは以下のメソッドです。

  • + (NSFileManager *)defaultManager
  • - (BOOL)fileExistsAtPath:(NSString *)path
  • - (BOOL)createDirectoryAtPath:(NSString *)path attributes:(NSDictionary *)attributes

defaultManagerメソッドで、予め用意されているNSFileManagerクラスのオブジェクトを入手できますので、これを使います。

fileExistsAtPath:メソッドで指定されたファイルあるいはディレクトリが存在するかどうかがわかります。引数に渡すパスに~が含まれる場合は、予め展開しておかないといけません。

createDirectoryAtPath:attributes:メソッドでディレクトリを作ります。attributesで色々なアトリビュート(オーナーやグループ、アクセス権など)を指定できますが、nilを指定しておけばデフォルトの値で作ってくれるので、とりあえずこれで問題ないでしょう。

したがってRepeating Motif Saverという名前のフォルダ(ディレクトリ)がなければ作るという処理は以下の様になります。

RepeatingMotifSaverView.m
- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
    self = [super initWithFrame:frame isPreview:isPreview];
    if(self)
    {
        ScreenSaverDefaults *ssd = [ScreenSaverDefaults
            defaultsForModuleWithName:RMSModuleName];
        NSFileManager   *fileManager = [NSFileManager defaultManager];
        NSArray         *paths = NSSearchPathForDirectoriesInDomains(
            NSLibraryDirectory, NSUserDomainMask, YES);
        
        [self setAnimationTimeInterval:1/10.0];
        [NSBundle loadNibNamed:RMSResourceName owner:self];
        transition      = [ssd integerForKey:@"transition"];
        hold            = [ssd integerForKey:@"hold"];
        layerMax        = [ssd integerForKey:@"layerMax"];
        fixToLayerMax   = [ssd boolForKey:@"fixToLayerMax"];
        selectedIndex   = [ssd integerForKey:@"selectedIndex"];

        masterMotifs = repeatingMotifs = nil;
        directory = [[NSString stringWithFormat:@"%@/%@",
            [paths objectAtIndex:0], RMSDirectoryName] retain];
        if(![fileManager fileExistsAtPath:directory])
            [fileManager createDirectoryAtPath:directory
                                    attributes:nil];
    }
    return self;
}


ページの先頭へ戻る