как мне создать временный файл с какао?

<p>несколько лет назад, когда я работал с c #, я мог легко создать временный файл и получить его имя с помощью этой функции:</p><pre><code>path.gettempfilename(); </code></pre><p>эта функция создаст файл с уникальным именем во временном каталоге и вернет полный путь к этому файлу. </p><p>в api какао самое близкое, что я могу найти, это:</p><pre><code>nstemporarydirectory </code></pre><p>я что-то упускаю очевидное или нет встроенного способа сделать это?</p>

<p>безопасным способом является использование <a href="http://developer.apple.com/documentation/darwin/reference/manpages/man3/mktemp.3.html">mkstemp (3)</a> .</p>

<p><strong> [примечание: это относится к iphone sdk, а не к mac os sdk] </strong> </p><p>из того, что я могу сказать, эти функции отсутствуют в sdk (файл <code>unistd.h</code> значительно сокращен по сравнению со стандартным файлом mac os x 10.5). я хотел бы использовать что-то вроде: </p><pre><code>[nstemporarydirectory() stringbyappendingpathcomponent: [nsstring stringwithformat: @"%.0f.%@", [nsdate timeintervalsincereferencedate] * 1000.0, @"txt"]]; </code></pre><p>не самый красивый, но функциональный</p>

<p>apple предоставила отличный способ доступа к временному каталогу и создания уникальных имен для временных файлов.</p><pre><code>- (nsstring *)pathfortemporaryfilewithprefix:(nsstring *)prefix { nsstring * result; cfuuidref uuid; cfstringref uuidstr; uuid = cfuuidcreate(null); assert(uuid != null); uuidstr = cfuuidcreatestring(null, uuid); assert(uuidstr != null); result = [nstemporarydirectory() stringbyappendingpathcomponent:[nsstring stringwithformat:@"%@-%@", prefix, uuidstr]]; assert(result != nil); cfrelease(uuidstr); cfrelease(uuid); return result; } </code></pre><p>ссылка :::: <a href="http://developer.apple.com/library/ios/#samplecode/simpleurlconnections/introduction/intro.html#//apple\_ref/doc/uid/dts40009245">http://developer.apple.com/library/ios/#samplecode/simpleurlconnections/introduction/intro.html#//apple\_ref/doc/uid/dts40009245</a> см. файл :: : appdelegate.m</p>

<p>хотя прошло почти год, я подумал, что все же полезно упомянуть пост в блоге «какао с любовью» мэтта галлахера. <a href="http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html">http://cocoawithlove.com/2009/07/tevent-files-and-folders-in-cocoa.html</a> он показывает, как использовать <strong><code>mkstemp()</code></strong> для файлов и <strong><code>mkdtemp()</code></strong> для каталогов, в комплекте с преобразованиями nsstring.</p>

<p>я создал чистое решение какао с помощью категории на <code>nsfilemanager</code>, которая использует комбинацию <code>nstemporary()</code> и глобально уникальный идентификатор.</p><p>вот заголовочный файл:</p><pre><code>@interface nsfilemanager (temporarydirectory) -(nsstring *) createtemporarydirectory; @end </code></pre><p>и файл реализации:</p><pre><code>@implementation nsfilemanager (temporarydirectory) -(nsstring *) createtemporarydirectory { // create a unique directory in the system temporary directory nsstring *guid = [[nsprocessinfo processinfo] globallyuniquestring]; nsstring *path = [nstemporarydirectory() stringbyappendingpathcomponent:guid]; if (![self createdirectoryatpath:path withintermediatedirectories:no attributes:nil error:nil]) { return nil; } return path; } @end </code></pre><p>это создает временный каталог, но его можно легко адаптировать для использования <code>createfileatpath:contents:attributes:</code> вместо <code>createdirectoryatpath:</code> для создания файла.</p>

<p>если используется ios 6.0 или mac os x 10.8 или выше:</p><pre><code>nsstring *tempfilepath = [nstemporarydirectory() stringbyappendingpathcomponent:[[nsuuid uuid] uuidstring]]; </code></pre>

<p>обновлено для swift 4.2, скопировано прямо с игровой площадки:</p><pre><code>import foundation func pathfortemporaryfile(with prefix: string) -> url { let uuid = uuid().uuidstring let pathcomponent = "\(prefix)-\(uuid)" var temppath = url(fileurlwithpath: nstemporarydirectory()) temppath.appendpathcomponent(pathcomponent) return temppath } let url = pathfortemporaryfile(with: "blah") print(url) </code></pre><p>или в качестве альтернативы ssswift:</p><pre><code>let prefix = "blah" let url2 = url(fileurlwithpath: nstemporarydirectory()).appendingpathcomponent("\(prefix)-\(uuid())") print(url2) </code></pre>

<p>вы можете использовать <a href="http://developer.apple.com/documentation/darwin/reference/manpages/man3/mktemp.3.html">mktemp</a> , чтобы получить временное имя файла.</p>

<p>современный способ сделать это - <code>filemanager</code>'s <a href="https://developer.apple.com/documentation/foundation/filemanager/1407693-url"><code>url(for:in:appropriatefor:create:)</code></a> .</p><p>с помощью этого метода вы можете указать <a href="https://developer.apple.com/documentation/foundation/filemanager.searchpathdirectory"><code>searchpathdirectory</code></a> , чтобы точно указать, какой временный каталог вы хотите. например, <code>.cachesdirectory</code> будет сохраняться между запусками (насколько это возможно) и сохраняться в библиотеке пользователя, а <code>.itemreplacementdirectory</code> будет находиться на том же томе, что и целевой файл.</p>

<p>вы можете использовать <code>nstask</code> - <code>uuidgen</code>, чтобы получить уникальное имя файла, а затем добавить его к строке из <code>nstemporarydirectory()</code>. это не будет работать на cocoa touch. это немного скучно, хотя.</p>

<p>добавление в @philipp:</p><pre><code>- (nsstring *)createtemporaryfile:(nsdata *)contents { // create a unique file in the system temporary directory nsstring *guid = [[nsprocessinfo processinfo] globallyuniquestring]; nsstring *path = [nstemporarydirectory() stringbyappendingpathcomponent:guid]; if(![self createfileatpath:path contents:contents attributes:nil]) { return nil; } return path; } </code></pre>