Titanium iOS adding isFile and isDirectory to the SDK

As I was building Dossier.js I ran into a small parity issue between iOS and Android.  On Android Titanium provides you two helper functions.  On a Ti.File object you can call isFile() to get a boolean indicator if your currently working with a file.  Likewise you can call isDirectory() to determine if you are working with a directory.  These are extremely helpful utilities when performing any kind of file system acrobatics.

How do we get this to work on iOS?  Easy, update the SDK and send a pull request.  Just shows how powerful open source can be.

Want to add this to your SDK now?  It couldn’t be easier, just follow the below three simple steps.

Updating your SDK

Find your SDK Directory

The first step is to find your Titanium SDK directory.  This is usually installed under a directory path similar to the one shown below.

path

Adding your methods

After locating your SDK directory, you will need to go to the Classes folder as shown below.

sdkdirectory

Look for the TiFilesystemFileProxy.m file and open this in your favorite text editor.

TiFileSystemProxy

Scroll down in the file until you see the method –(id)createFile:(id)args right above this method paste in the below.

-(id)isFile:(id)unused
{
	BOOL isDirectory;
	return ([fm fileExistsAtPath:path isDirectory:&isDirectory] && !isDirectory);
}

-(id)isDirectory:(id)unused
{
	BOOL isDirectory;
	return ([fm fileExistsAtPath:path isDirectory:&isDirectory] && isDirectory);
}

view on gist

Once completed, save the file (TiFilesystemFileProxy.m)

Clean your project & done

You will need to clean your Titanium Projects before the SDK modifications will be available.  To clean your projects using Titanium Studio go to the Project menu and select Clean… as shown below.

cleanmenu

In the Clean Dialog Window, select Clean All Projects.

cleandialog

You are now ready to use these new functions in your Titanium Projects.

How what? How does it work?

After adding these updates to your SDK, the Ti.File object will have the same isFile and isDirectory methods as they do on Android.  Below is a demonstration app.js you can use for testing.


//Test if the resources folder is a directory.
var resourceDir = Titanium.Filesystem.getFile(Titanium.Filesystem.resourcesDirectory);
Ti.API.info('resourceDir ' + resourceDir);
Ti.API.info('resourceDir nativePath ' + resourceDir.nativePath);
Ti.API.info('resourceDir isDirectory ' + resourceDir.isDirectory());
Ti.API.info('resourceDir isFile ' + resourceDir.isFile());

var newDir = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory,'mydir');
if(!newDir.exists()){
  Ti.API.info("Created mydir: " + newDir.createDirectory());
}

var newFile = Titanium.Filesystem.getFile(newDir.nativePath,'newfile.txt');
newFile.write("\nText appended via write()", true);

Ti.API.info('newdir ' + newDir);
Ti.API.info('newdir nativePath ' + newDir.nativePath);
Ti.API.info('newdir isDirectory ' + newDir.isDirectory());
Ti.API.info('newdir isFile ' + newDir.isFile());

Ti.API.info('newFile ' + newFile);
Ti.API.info('newFile nativePath ' + newFile.nativePath);
Ti.API.info('newFile isDirectory ' + newFile.isDirectory());
Ti.API.info('newFile isFile ' + newFile.isFile());

Ti.API.info('Now open a window so we can test on device easier');

// Create a simple window to show our results
(function(){

	var win = Ti.UI.createWindow({
		backgroundColor:'#fff',layout:'vertical'
	});

	win.add(Ti.UI.createLabel({
		top:10, text:'resourceDir isDirectory ' + resourceDir.isDirectory()
	}));

	win.add(Ti.UI.createLabel({
		top:10, text:'resourceDir isFile ' + resourceDir.isFile()
	}));

	win.add(Ti.UI.createLabel({
		top:10, text:'newdir isDirectory ' + newDir.isDirectory()
	}));

	win.add(Ti.UI.createLabel({
		top:10, text:'newdir isFile ' + newDir.isFile()
	}));

	win.add(Ti.UI.createLabel({
		top:10, text:'newFile isDirectory ' + newFile.isDirectory()
	}));

	win.add(Ti.UI.createLabel({
		top:10, text:'newFile isFile ' + newFile.isFile()
	}));

	win.open();

})();

Ti.API.info('End Test');

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s