aboutsummaryrefslogtreecommitdiff
path: root/Foundation
diff options
context:
space:
mode:
authorGravatar thomasvl <thomasvl@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2008-02-27 22:26:35 +0000
committerGravatar thomasvl <thomasvl@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2008-02-27 22:26:35 +0000
commit1270f0c1ee5cf31faadc6ca41cf487cdd9e91508 (patch)
treee746e426a90bc27032b342e2861c59fcae6d6f12 /Foundation
parentf38d4ee0e9157d2ac3c9a08fde37b9e19457fb0f (diff)
Added GTMNSFileManager+Path for two small helpers.
Diffstat (limited to 'Foundation')
-rw-r--r--Foundation/GTMNSFileManager+Path.h71
-rw-r--r--Foundation/GTMNSFileManager+Path.m102
-rw-r--r--Foundation/GTMNSFileManager+PathTest.m58
3 files changed, 231 insertions, 0 deletions
diff --git a/Foundation/GTMNSFileManager+Path.h b/Foundation/GTMNSFileManager+Path.h
new file mode 100644
index 0000000..330c45e
--- /dev/null
+++ b/Foundation/GTMNSFileManager+Path.h
@@ -0,0 +1,71 @@
+//
+// GTMNSFileManager+Path.h
+//
+// Copyright 2006-2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+#import <Foundation/Foundation.h>
+
+
+/// A few useful methods for dealing with paths.
+@interface NSFileManager (GMFileManagerPathAdditions)
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+
+/// For the Unix-y at heart, this is "mkdir -p". It tries to create
+/// the directory specified by |path|, and any intervening directories that
+/// are needed. Each directory that is created is created with |attributes|
+/// (see other NSFileManager doco for the details on |attributes|).
+///
+/// If you are building for 10.5 or later, you should just use the new api:
+/// createDirectoryAtPath:withIntermediateDirectories:attributes:error:
+///
+/// Args:
+/// path - the path of the directory to create.
+/// attributes - these are defined in the "Constants" section of Apple's
+/// NSFileManager doco
+///
+/// Returns:
+/// YES if |path| exists or was able to be created successfully
+/// NO otherwise
+///
+- (BOOL)gtm_createFullPathToDirectory:(NSString *)path
+ attributes:(NSDictionary *)attributes;
+
+#endif // MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+
+/// Return an the paths for all resources in |directoryPath| that have the
+/// |extension| file extension.
+///
+/// Args:
+/// extension - the file extension (excluding the leading ".") to match.
+/// If nil, all files are matched.
+/// directoryPath - the directory to look in. Subdirectories are not traversed.
+///
+/// Returns:
+/// An NSArray of absolute file paths that have |extension|. nil is returned
+/// if |directoryPath| doesn't exist or can't be opened, and returns an empty
+/// array if |directoryPath| is empty. ".", "..", and resource forks are never returned.
+///
+- (NSArray *)gtm_filePathsWithExtension:(NSString *)extension
+ inDirectory:(NSString *)directoryPath;
+
+/// Same as -filePathsWithExtension:inDirectory: except |extensions| is an
+/// NSArray of extensions to match.
+///
+- (NSArray *)gtm_filePathsWithExtensions:(NSArray *)extensions
+ inDirectory:(NSString *)directoryPath;
+
+@end
diff --git a/Foundation/GTMNSFileManager+Path.m b/Foundation/GTMNSFileManager+Path.m
new file mode 100644
index 0000000..6dec24b
--- /dev/null
+++ b/Foundation/GTMNSFileManager+Path.m
@@ -0,0 +1,102 @@
+//
+// GTMNSFileManager+Path.m
+//
+// Copyright 2006-2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+#import "GTMNSFileManager+Path.h"
+
+@implementation NSFileManager (GMFileManagerPathAdditions)
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+
+- (BOOL)gtm_createFullPathToDirectory:(NSString *)path
+ attributes:(NSDictionary *)attributes {
+ if (!path) return NO;
+
+ BOOL isDir;
+ BOOL exists = [self fileExistsAtPath:path isDirectory:&isDir];
+
+ // Quick check for the case where we have nothing to do.
+ if (exists && isDir)
+ return YES;
+
+ NSString *actualPath = @"/";
+ NSEnumerator *directoryEnumerator = [[path pathComponents] objectEnumerator];
+ NSString *directory;
+
+ while ((directory = [directoryEnumerator nextObject])) {
+ actualPath = [actualPath stringByAppendingPathComponent:directory];
+
+ if ([self fileExistsAtPath:actualPath isDirectory:&isDir] && isDir) {
+ continue;
+ } else if ([self createDirectoryAtPath:actualPath attributes:attributes]) {
+ continue;
+ } else {
+ return NO;
+ }
+ }
+
+ return YES;
+}
+
+#endif // MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+
+- (NSArray *)gtm_filePathsWithExtension:(NSString *)extension
+ inDirectory:(NSString *)directoryPath {
+ NSArray *extensions = nil;
+
+ // Treat no extension and an empty extension as the user requesting all files
+ if (extension != nil && ![extension isEqualToString:@""])
+ extensions = [NSArray arrayWithObject:extension];
+
+ return [self gtm_filePathsWithExtensions:extensions
+ inDirectory:directoryPath];
+}
+
+- (NSArray *)gtm_filePathsWithExtensions:(NSArray *)extensions
+ inDirectory:(NSString *)directoryPath {
+ if (directoryPath == nil)
+ return nil;
+
+ // |basenames| will contain only the matching file names, not their full paths.
+ NSArray *basenames = [self directoryContentsAtPath:directoryPath];
+
+ // Check if dir doesn't exist or couldn't be opened.
+ if (basenames == nil)
+ return nil;
+
+ // Check if dir is empty.
+ if ([basenames count] == 0)
+ return basenames;
+
+ NSMutableArray *paths = [NSMutableArray arrayWithCapacity:[basenames count]];
+ NSString *basename;
+ NSEnumerator *basenamesEnumerator = [basenames objectEnumerator];
+
+ // Convert all the |basenames| to full paths.
+ while ((basename = [basenamesEnumerator nextObject])) {
+ NSString *fullPath = [directoryPath stringByAppendingPathComponent:basename];
+ [paths addObject:fullPath];
+ }
+
+ // Check if caller wants all files, regardless of extension.
+ if (extensions == nil || [extensions count] == 0)
+ return paths;
+
+ return [paths pathsMatchingExtensions:extensions];
+}
+
+@end
diff --git a/Foundation/GTMNSFileManager+PathTest.m b/Foundation/GTMNSFileManager+PathTest.m
new file mode 100644
index 0000000..10b4cbd
--- /dev/null
+++ b/Foundation/GTMNSFileManager+PathTest.m
@@ -0,0 +1,58 @@
+//
+// GTMNSFileManager+PathTest.m
+//
+// Copyright 2006-2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+#import <SenTestingKit/SenTestingKit.h>
+#import "GTMNSFileManager+Path.h"
+
+@interface GTMNSFileManager_PathTest : SenTestCase
+@end
+
+@implementation GTMNSFileManager_PathTest
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+
+- (void)testCreateFullPathToDirectoryAttributes {
+ NSString *baseDir =
+ [NSTemporaryDirectory() stringByAppendingPathComponent:@"testCreateFullPathToDirectoryAttributes"];
+ NSString *testPath = [baseDir stringByAppendingPathComponent:@"/foo/bar/baz"];
+ NSFileManager *fm = [NSFileManager defaultManager];
+
+ STAssertFalse([fm fileExistsAtPath:testPath],
+ @"You must delete '%@' before running this test", baseDir);
+
+ STAssertTrue([fm gtm_createFullPathToDirectory:testPath attributes:nil],
+ @"Failed to create nested testPath");
+
+ STAssertTrue([fm removeFileAtPath:baseDir handler:nil],
+ @"Failed to delete \'%@\'", baseDir);
+
+ NSString *pathToFail = [@"/etc" stringByAppendingPathComponent:testPath];
+ STAssertFalse([fm gtm_createFullPathToDirectory:pathToFail attributes:nil],
+ @"We were allowed to create a dir in '/etc'?!");
+
+ STAssertFalse([fm gtm_createFullPathToDirectory:nil attributes:nil],
+ @"Should have failed when passed (nil)");
+}
+
+#endif // MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+
+- (void)testfilePathsWithExtensionsInDirectory {
+ // TODO: need a test for filePathsWithExtensions:inDirectory:
+}
+
+@end