<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Create temp directory</title>
		<link>http://www.allegro.cc/forums/view/590936</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 11 Apr 2007 05:33:10 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I need a way to create a temporary directory name.  I&#39;ve used tempnam(NULL) and it only seems to return 4 digit names with something like &quot;\aer2.&quot; which is not exactly what I&#39;m looking for.  Anyone know of a better (no .NET) way of creating a unique temporary name consisting of 8-10 characters?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve Terry)</author>
		<pubDate>Tue, 10 Apr 2007 04:00:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What I do when I need to create temp files is get the current time in milliseconds. That nomber is converted to a string and used as the name for my temp file/dir.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Rampage)</author>
		<pubDate>Tue, 10 Apr 2007 06:27:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, date/time would have to be the only reliable way to generate a unique filename.</p><p>Even then, because computers operate so fast it&#39;s possible for more than one to be created in the same milisecond (or whatever measure your method of getting time is)(depending on your application, of course) so you&#39;ll probably want a way to query the filesystem to make sure that the directory doesn&#39;t already exist.</p><p>Besides, for all you know there was already a directory named 20070409103029.ext or the like from a separate application or user. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>Now that I think of it you might get away with hashing a random value, for example with SHA1 or MD5 or something, but I don&#39;t know how unique those are.</p><p>Okay, generate a random value and hash that, salted with a numeric datetime!</p><p>...And then query the filesystem to make sure the file doesn&#39;t already exist (if it does start the process over). <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Tue, 10 Apr 2007 07:29:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What&#39;s wrong with a name like &quot;/aer2&quot;? As long as the name refers to a directory that doesn&#39;t already exist...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (tobing)</author>
		<pubDate>Tue, 10 Apr 2007 11:53:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">tobing said:</div><div class="quote"><p>
What&#39;s wrong with a name like &quot;/aer2&quot;? As long as the name refers to a directory that doesn&#39;t already exist...
</p></div></div><p>

True, there&#39;s nothing wrong with that directory name. What was the problem with it?</p><p>The only potential problem is the decreased probability of a 4-character string being unique; especially if the directory it&#39;s working in is used often or by numerous people at a time.</p><p>The time is a better tactic anyway. In any case, you&#39;ll always have to check if the file exists or not before writing to make sure you don&#39;t damage another file.</p><div class="quote_container"><div class="title">tempnam - Manual said:</div><div class="quote"><p>
Creates a file with a unique filename, with access permission set to 0600, in the specified directory. If the directory does not exist, tempnam() may generate a file in the system&#39;s temporary directory, and return the name of that.
</p></div></div><p> -<a href="http://ca.php.net/tempnam">Source</a></p><p>In PHP it sounds like it actually returns a unique name, as in PHP checks that it doesn&#39;t exist yet (and might even create it for you). What language are you developing with??
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Tue, 10 Apr 2007 18:48:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
tempnam(NULL)
</p></div></div><p>tempnam accepts two arguments:
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
SYNOPSIS<br />       #include &lt;stdio.h&gt;</p><p>       char *tempnam(const char *dir, const char *pfx);</p><p>DESCRIPTION<br />       The  tempnam()  function returns a pointer to a string that is a valid file-<br />       name, and such that a file with this  name  did  not  exist  when  tempnam()<br />       checked.   The filename suffix of the pathname generated will start with pfx<br />       in case pfx is a non-NULL string of at most five bytes.  The directory  pre-<br />       fix  part  of  the pathname generated is required to be `appropriate&#39; (often<br />       that at least implies writable).</p><p>       Attempts to find an appropriate directory go through the following steps:</p><p>       a)     In case the environment variable TMPDIR exists and contains the  name<br />              of an appropriate directory, that is used.</p><p>       b)     Otherwise,  if  the  dir  argument is non-NULL and appropriate, it is<br />              used.</p><p>       c)     Otherwise, P_tmpdir (as defined in &lt;stdio.h&gt;) is used when  appropri-<br />              ate.</p><p>       d)     Finally an implementation-defined directory may be used.</p><p>       The  string  returned  by  tempnam()  is allocated using malloc(3) and hence<br />       should be freed by free(3).
</p></div></div><p>

[append]<br />If I were you, I&#39;d do <tt>tempnam(getenv(&quot;TEMP&quot;), &quot;MyProgram&quot;)</tt>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Tue, 10 Apr 2007 20:32:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ahh the documentation I was looking at only had tmpnam taking in one argument, not two.  At any rate I just friggin used abs and rand to generate me a nice number (between 10000 and 99999) and used that for the directory name and checked if it existed first.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve Terry)</author>
		<pubDate>Wed, 11 Apr 2007 04:27:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I wrote a new tmpfile method for allegro 4.3 to handle all this. it atm, returns a file descriptor, so its just for files, but its not hard to make one for dirs either. It handles &quot;anonymous&quot; temp files (ones that are unlinked immediately), and can auto delete upon file close.</p><p>I hadn&#39;t considered making a temp dir version. Maybe if people request it enough.</p><p>code: (for the stdio handler, windows code will likely use one of the Win32 functions, if its deemed necessary)
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#define MAX_MKTEMP_TRIES 1000</span></td></tr><tr><td class="number">2</td><td><span class="k1">const</span> <span class="k1">char</span> mktemp_ok_chars<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"</span><span class="k2">;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="k1">void</span> _al_fs_mktemp_replace_XX<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span><span class="k1">template</span>, <span class="k1">char</span> <span class="k3">*</span>dst<span class="k2">)</span></td></tr><tr><td class="number">5</td><td><span class="k2">{</span></td></tr><tr><td class="number">6</td><td>   size_t len <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span><span class="k1">template</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>   uint32_t i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>   <span class="k1">for</span><span class="k2">(</span>i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>len<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>      <span class="k1">if</span><span class="k2">(</span><span class="k1">template</span><span class="k3">&lt;</span>i&gt; <span class="k3">!</span><span class="k3">=</span> <span class="s">'X'</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>         dst<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> <span class="k1">template</span><span class="k3">&lt;</span>i&gt;<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">13</td><td>      <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>         dst<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> mktemp_ok_chars<span class="k2">[</span> _al_rand<span class="k2">(</span><span class="k2">)</span> % <span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>mktemp_ok_chars<span class="k2">)</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span> <span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">16</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">17</td><td><span class="k2">}</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><span class="c">/* FIXME: provide the filename created. */</span></td></tr><tr><td class="number">20</td><td><span class="c">/* might have to make AL_FS_ENTRY a strust to provide the filename, and unlink hint. */</span></td></tr><tr><td class="number">21</td><td><span class="c">/* by default, temp file is NOT unlink'ed automatically */</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>AL_FS_ENTRY <span class="k3">*</span>al_fs_stdio_mktemp<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span><span class="k1">template</span>, uint32_t ulink<span class="k2">)</span></td></tr><tr><td class="number">24</td><td><span class="k2">{</span></td></tr><tr><td class="number">25</td><td>   int32_t fd <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span>, tries <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>   int32_t template_len <span class="k3">=</span> <span class="n">0</span>, tmpdir_len <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>   AL_FS_ENTRY <span class="k3">*</span>fh <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>   <span class="k1">char</span> <span class="k3">*</span>dest <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>   <span class="k1">char</span> tmpdir<span class="k2">[</span>PATH_MAX<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td>   template_len <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span> <span class="k1">template</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>   <span class="k1">if</span><span class="k2">(</span>al_get_path<span class="k2">(</span>AL_TEMP_PATH, tmpdir, PATH_MAX<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">34</td><td>      <a href="http://www.allegro.cc/manual/ustrzcpy" target="_blank"><span class="a">ustrzcpy</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/allegro_error" target="_blank"><span class="a">allegro_error</span></a>, ALLEGRO_ERROR_SIZE, <a href="http://www.allegro.cc/manual/get_config_text" target="_blank"><span class="a">get_config_text</span></a><span class="k2">(</span><span class="s">"Failed to find temp directory"</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>      <span class="k1">return</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">36</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">37</td><td>&#160;</td></tr><tr><td class="number">38</td><td>   tmpdir_len <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span> tmpdir_len <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td>   dest <span class="k3">=</span> AL_MALLOC<span class="k2">(</span> template_len <span class="k3">+</span> tmpdir_len <span class="k3">+</span> <span class="n">2</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>dest<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">42</td><td>      <span class="k3">*</span>allegro_errno <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_293.html" target="_blank">errno</a><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>      <span class="k1">return</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">44</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">45</td><td>&#160;</td></tr><tr><td class="number">46</td><td>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span>dest, <span class="n">0</span>, template_len <span class="k3">+</span> tmpdir_len <span class="k3">+</span> <span class="n">2</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_566.html" target="_blank">memcpy</a><span class="k2">(</span>dest, tmpdir, <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span> tmpdir <span class="k2">)</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td>   <span class="c">/* doing this check makes the path prettier, no extra / laying around */</span></td></tr><tr><td class="number">50</td><td>   <span class="k1">if</span><span class="k2">(</span>dest<span class="k2">[</span>tmpdir_len-1<span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> <span class="s">'/'</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">51</td><td>      dest<span class="k2">[</span>tmpdir_len<span class="k2">]</span> <span class="k3">=</span> <span class="s">'/'</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>      tmpdir_len<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">54</td><td>&#160;</td></tr><tr><td class="number">55</td><td>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_566.html" target="_blank">memcpy</a><span class="k2">(</span>dest <span class="k3">+</span> tmpdir_len, <span class="k1">template</span>, template_len<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>&#160;</td></tr><tr><td class="number">57</td><td>   <span class="k1">for</span><span class="k2">(</span>i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>MAX_MKTEMP_TRIES<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">58</td><td>      _al_fs_mktemp_replace_XX<span class="k2">(</span><span class="k1">template</span>, dest <span class="k3">+</span> tmpdir_len<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>      fd <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_600.html" target="_blank">open</a><span class="k2">(</span> dest, O_EXCL <span class="k3">|</span> O_CREAT <span class="k3">|</span> O_RDWR <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">60</td><td>      <span class="k1">if</span><span class="k2">(</span>fd <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">61</td><td>         <span class="k1">continue</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>&#160;</td></tr><tr><td class="number">63</td><td>      <span class="c">// changing the hook for create handle in a separate thread will cause some nice errors here,</span></td></tr><tr><td class="number">64</td><td>      <span class="c">//    if you expect it to return a stdio handle ;)</span></td></tr><tr><td class="number">65</td><td>      fh <span class="k3">=</span> al_fs_create_handle<span class="k2">(</span> dest <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>fh<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">67</td><td>         <a href="http://www.delorie.com/djgpp/doc/libc/libc_104.html" target="_blank">close</a><span class="k2">(</span>fd<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td>         <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>dest<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>         <span class="k1">return</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">70</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">71</td><td>&#160;</td></tr><tr><td class="number">72</td><td>      fh-&gt;handle <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_312.html" target="_blank">fdopen</a><span class="k2">(</span> fd, <span class="s">"r+"</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>fh-&gt;handle<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">74</td><td>         al_fs_stdio_destroy_handle<span class="k2">(</span>fh<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">75</td><td>         <a href="http://www.delorie.com/djgpp/doc/libc/libc_104.html" target="_blank">close</a><span class="k2">(</span>fd<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>         <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>dest<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>         <span class="k1">return</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">78</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">79</td><td>&#160;</td></tr><tr><td class="number">80</td><td>      <span class="k1">if</span><span class="k2">(</span>ulink <span class="k3">=</span><span class="k3">=</span> AL_FS_MKTEMP_UNLINK_NOW<span class="k2">)</span></td></tr><tr><td class="number">81</td><td>         <a href="http://www.delorie.com/djgpp/doc/libc/libc_839.html" target="_blank">unlink</a><span class="k2">(</span> dest <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">82</td><td>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ulink <span class="k3">=</span><span class="k3">=</span> AL_FS_MKTEMP_UNLINK_ON_CLOSE<span class="k2">)</span></td></tr><tr><td class="number">83</td><td>         fh-&gt;ulink <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td>&#160;</td></tr><tr><td class="number">85</td><td>      fh-&gt;free_on_fclose <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>      fh-&gt;path <span class="k3">=</span> dest<span class="k2">;</span></td></tr><tr><td class="number">87</td><td>&#160;</td></tr><tr><td class="number">88</td><td>      <span class="k1">return</span> fh<span class="k2">;</span></td></tr><tr><td class="number">89</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">90</td><td>&#160;</td></tr><tr><td class="number">91</td><td>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>dest<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">92</td><td>   <a href="http://www.allegro.cc/manual/ustrzcpy" target="_blank"><span class="a">ustrzcpy</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/allegro_error" target="_blank"><span class="a">allegro_error</span></a>, ALLEGRO_ERROR_SIZE, <a href="http://www.allegro.cc/manual/get_config_text" target="_blank"><span class="a">get_config_text</span></a><span class="k2">(</span><span class="s">"Failed to create a uniqe temporary file"</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">93</td><td>   <span class="k1">return</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">94</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
It shouldn&#39;t be hard to make that do a dir at all. Or turn into code that doesn&#39;t rely on my Allegro 4.3 stuff.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Wed, 11 Apr 2007 05:33:10 +0000</pubDate>
	</item>
</rss>
