[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Generating a semi-random, but legal, filename

Daniel Berger

9/17/2008 1:37:00 PM

Hi everyone,

I thought this would be a fun brain teaser. In short, I need a way to
generate a semi-random file name based on a template on MS Windows.
The motivation, in case you're wondering, is that I'm implementing a
pure Ruby version of the mkstemp() function, which MS Windows does not
support.

The rules:

1 - The template itself must be a legal MS Windows file name
2 - The template must end with at least six 'X' characters. Raise an
error otherwise.
3 - All 'X' characters should be replaced with a (semi) random
character
4 - All replaced characters must be legal filename characters on MS
Windows

For example, my_template_XXXXXX would become my_template_T$#z%Ya

What's a legal filename on Windows? To keep it simple, we'll just
worry about these three rules:

* The following characters are illegal: < > : " / \ | ? *
* Characters whose integer representations are in the range from zero
through 31 are not allowed.
* Cannot end with a space

In case that first point is difficult to read on your browser, the
explicitly illegal characters are greater than, less than, colon,
forward slash, backslash, pipe, question mark and asterisk.

Good luck!

Dan

- Details for legal file names at http://msdn.microsoft.com/en-us/librar...(VS.85).aspx
- Details for mkstemp at http://www.opengroup.org/onlinepubs/009695399/functions/mk...

5 Answers

Brian Candler

9/17/2008 1:52:00 PM

0

> I thought this would be a fun brain teaser. In short, I need a way to
> generate a semi-random file name based on a template on MS Windows.
> The motivation, in case you're wondering, is that I'm implementing a
> pure Ruby version of the mkstemp() function, which MS Windows does not
> support.

Aside, for those who aren't aware, there is tempfile.rb in the Ruby
standard library which does something similar: i.e. create a random name
from a template, then open the file.

The names it generates aren't really random, but AFAICT are guaranteed
to be unique. The documentation for mkstemp doesn't make any claims to
randomness either though.
--
Posted via http://www.ruby-....

Heesob Park

9/17/2008 3:43:00 PM

0

2008/9/17 Daniel Berger <djberg96@gmail.com>:
> Hi everyone,
>
> I thought this would be a fun brain teaser. In short, I need a way to
> generate a semi-random file name based on a template on MS Windows.
> The motivation, in case you're wondering, is that I'm implementing a
> pure Ruby version of the mkstemp() function, which MS Windows does not
> support.
>
To be fair, MS Windows supports _mktemp() function.
mkstemp() can be defined as

def mkstemp(p)
require 'Win32API'
_mktemp = Win32API.new("msvcrt", "_mktemp", 'P', 'P')
File.open(_mktemp.call('my_template_XXXXXX'),File::CREAT|File::EXCL)
end

Regards,

Park Heesob

Lloyd Linklater

9/17/2008 6:54:00 PM

0

Daniel Berger wrote:

> For example, my_template_XXXXXX would become my_template_T$#z%Ya

How about this:

def getRandLetter
65 + rand(26)
end

def randomFileNameSuffix (baseFileName, numberOfRandomchars)
numberOfRandomchars.times { baseFileName << getRandLetter }
baseFileName
end

fn = randomFileNameSuffix("foo_", 7)
puts fn
--
Posted via http://www.ruby-....

Lloyd Linklater

9/17/2008 7:30:00 PM

0

Actually, this might be a bit cleaner:

def randomFileNameSuffix (numberOfRandomchars)
s = ""
numberOfRandomchars.times { s << (65 + rand(26)) }
s
end

puts "foo_" + randomFileNameSuffix(7) + ".txt"

=> foo_OLNMGZZ.txt

Note: the 65 added is the numeric value of "A". rand(26) gives 0..25.
So, we add that to a capital "A" to get the random letter.

It is rather simple but that is not always a defect.
--
Posted via http://www.ruby-....

Daniel Berger

9/18/2008 1:35:00 AM

0

On Sep 17, 1:30 pm, Lloyd Linklater <ll...@2live4.com> wrote:
> Actually, this might be a bit cleaner:
>
> def randomFileNameSuffix (numberOfRandomchars)
>   s = ""
>   numberOfRandomchars.times { s << (65 + rand(26))  }
>   s
> end
>
> puts "foo_" + randomFileNameSuffix(7) + ".txt"
>
> => foo_OLNMGZZ.txt
>
> Note:  the 65 added is the numeric value of "A".  rand(26) gives 0..25.
> So, we add that to a capital "A" to get the random letter.
>
> It is rather simple but that is not always a defect.

Simple, effective. Looks good to me!

Regards,

Dan