views:

554

answers:

2

Hi,

I'm using very tricky fighting methods :) to make a string like 'Fi?le*/ Name' safe for using as a file name like 'File_Name'. I'm sure there is a cocoa way to convert it. And I'm sure the best place to ask is here :)

Thank you!

+4  A: 

Unless you're explicitly running the shell or implicitly running the shell by using a function such as popen or system, there's no reason to escape anything but the pathname separator.

You may also want to enforce that the filename does not begin with a full stop (which would cause Finder to hide the file) and probably should also enforce that it is not empty and is fewer than NAME_MAX characters* long.

*syslimits.h says bytes, but if you go through File Manager, it's characters. I'm not sure which is right for Cocoa.

Peter Hosey
A: 

If you're not too picky about what characters allowable in the file name, this should do:

NSString* sourceString = ...; // get string from somewhere
NSCharacterSet* illegalFileNameChars = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
NSString* fileNameString = [sourceString stringByTrimmingCharactersInSet:illegalFileNameChars];

If course this also trims out legal file name characters such as dashes "-" but then again different file systems have their own notion of what's legal and what's not (think FAT and network-based file systems) and thus the lowest common denominator of legal characters for file names are letters and numbers only.

adib