John,
I shouldn't answer because I know nothing about Windows API - but I
do use a lot of Linux native things in my J programs. If I get into
things like Sockets, then I use the various covers for the 15!:x
family - and something in that area may be required for your GUID
query. I see that Bill Lam has provided a good answer for your first
question. I offer a long winded version of his answer for the other 3.
For your other questions I use 2!:0 (host) - not directly but as the
following verb:
host =: [: 2!:0 '('"_ , ] , ' || true)'"_
This returns the result of a Linux command as a text string - easily
parsed in j to extract information. The reason for the complexity is
that "host" returns a result, even if an error is generated on the
Linux side - it also generates standard error output which is
displayed in your session - e.g.
Linux comand df -h displays filesystem information in human (-h)
format, i.e. Bytes instead of blocks. e.g.
$x =. host 'df -h'
439
x
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/set1-root
906G 9.0G 851G 2% /
none 2.0G 212K 2.0G 1% /dev
none 2.0G 0 2.0G 0% /dev/shm
none 2.0G 364K 2.0G 1% /var/run
none 2.0G 0 2.0G 0% /var/lock
none 2.0G 0 2.0G 0% /lib/init/rw
/dev/sda1 228M 36M 181M 17% /boot
$x =. host 'lskdjf'
sh: lskdjf: not found
0
x
I move or rename files a lot using host - since rename in Linux is mv
(move) that operation happens very quickly, independent of file size.
If the mv is from one file system to another, a copy (cp) is executed
followed by removing (rm) the source file - this takes time depending
on the size of the file.
If you want control of your session while a long operation is
running, I suggest using 2!:1 (spawn) - and even there you need to
fork the task on the Linux side, here are some examples:
host 'ls -l JAusten2.toast '
-rw-r--r-- 1 jkt jkt 4170022912 2010-12-24 20:25 JAusten2.toast
$x =. 2!:1 'cp JAusten2.toast bigfile &'
0
The above result happens immediately - but the process started by the
ending & keeps running, as shown by
host 'ls -l bigfile'
-rw-r--r-- 1 jkt jkt 945422336 2011-05-08 15:51 bigfile
host 'ls -l bigfile'
-rw-r--r-- 1 jkt jkt 4170022912 2011-05-08 15:52 bigfile
I rarely need to copy large files so I don't often use spawn (2!:1)
and host works fine for mv -
host 'mv bigfile largefile' NB. this happens very quickly
That is in 4 milliseconds on my machine. Even if the file is several
megabytes, a copy is reasonably quick, so again, I rarely use spawn.
I think host and spawn can likely meet your requirements nicely by
using regular Linux facilities (along with a little parsing, ": and
". on the J side).
- joey
At 2:07 PM -0500 11/05/08, John Baker wrote:
>Greetings J'ugglers,
>
>In the last week I have set up a Linux Ubuntu box and installed J 7.01 on
>it. The JGTK version is very zippy in this environment and I am looking
>forward to porting JOD to Linux systems.
>
>JOD is 99% J with a few key WINAPI calls. I need to find Linux equivalents
>to the following WINAPI calls. I am new to Linux and unfamiliar with Linux
>APIs so if any of you could provide pointers I would appreciate it.
>
>The calls I am looking to replace are:
>
>NB. generates a GUID with dll call
>genguid=:'ole32.dll CoCreateGuid i *c'&cd
>
>NB. returns free disk space
>'kernel32 GetDiskFreeSpaceA i *c *i *i *i *i' cd y;(,0);(,0);(,0);(,0)
>
>NB. Win32 procedure that copies files
>copyfile=:'kernel32 CopyFileA i *c *c i'&cd
>
>NB. Win32 procedure that moves/renames files
>movefile=:'kernel32 MoveFileA i *c *c'&cd
>
>--
>John D. Baker
>[email protected]
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm