[Win32utils-devel] _mktemp on Windows
Heesob Park
phasis at gmail.com
Tue Jan 17 19:47:57 EST 2012
Hi,
2012/1/18 Daniel Berger <djberg96 at gmail.com>:
> On Tue, Jan 17, 2012 at 11:36 AM, Daniel Berger <djberg96 at gmail.com> wrote:
>> On Tue, Jan 17, 2012 at 5:00 AM, Heesob Park <phasis at gmail.com> wrote:
>>> Hi,
>>>
>>> 2012/1/14 Daniel Berger <djberg96 at gmail.com>:
>>>> Is it odd that calling _mktemp more than once in the same process doesn't work?
>>>>
>>>> require 'ffi'
>>>>
>>>> class Win
>>>> extend FFI::Library
>>>>
>>>> ffi_lib 'msvcrt'
>>>> attach_function :_mktemp, [:string], :string
>>>>
>>>> def self.mktemp
>>>> 5.times{ p _mktemp("rb_file_temp_XXXXXX") }
>>>> end
>>>> end
>>>>
>>>> Win.mktemp
>>>>
>>>> # Output
>>>> "rb_file_temp_a03680"
>>>> nil
>>>> nil
>>>> nil
>>>> nil
>>>
>>> Here is a proper working version:
>>>
>>>
>>> require 'ffi'
>>>
>>> class Win
>>> extend FFI::Library
>>>
>>> ffi_lib 'msvcrt'
>>> attach_function :_mktemp, [:pointer], :string
>>>
>>> def self.mktemp
>>> 5.times {
>>> buf = FFI::MemoryPointer.from_string("rb_file_temp_XXXXXX")
>>> p _mktemp(buf)
>>> }
>>> end
>>> end
>>>
>>> Win.mktemp
>>
>> That's better, though it seems to return the same string each time
>> instead of providing a new one. I get:
>>
>> "rb_file_temp_a03200"
>> "rb_file_temp_a03200"
>> "rb_file_temp_a03200"
>> "rb_file_temp_a03200"
>> "rb_file_temp_a03200"
>
> Actually, I get the same result with the C code that MS provides, too.
>
> I think I might be better off writing a custom mktemp method in pure Ruby.
>
I guess you overlooked the C code that MS provides, it created file
with temp names.
If you want the same result with the C code, here is a modified version:
require 'ffi'
class Win
extend FFI::Library
ffi_lib 'msvcrt'
attach_function :_mktemp, [:pointer], :string
def self.mktemp
5.times {
buf = FFI::MemoryPointer.from_string("rb_file_temp_XXXXXX")
p res = _mktemp(buf)
File.open(res,"w")
}
end
end
Win.mktemp
#output
"rb_file_temp_a03144"
"rb_file_temp_b03144"
"rb_file_temp_c03144"
"rb_file_temp_d03144"
"rb_file_temp_e03144"
Regards,
Park Heesob
More information about the win32utils-devel
mailing list