1. Deleting a file

Hi, I've got a problem:
I need to delete a file, but don't want to use the system() function,
cause it has to be "transparent" to the user. So I got this bright
idea of using DOS interrupts (#21). At the end is the code I used, but
it doesn't work... I keep getting DOS error 2 (file not found) and
5 (access denied). Can anyone tell me what is wrong? Is there any
other way to that?
I also needed to copy a file but I solve that with a loop of getc() and
puts() until an EOF.. is there another eficient way?

Thanks.


-------------CUT HERE--------------

-- SYS_DEL()
-- Uses DOS INT #21, service #41 to delete a file given an ASCIIZ filename
-- Returns 1 if succesfull, else return 0 and displays DOS error code

-- INT reference: HelpPC 2.1
function sys_del(sequence filename)
    sequence reg_list
    integer buff

    buff = allocate_low(length(filename)+1)
    poke(buff,filename)
    poke(buff+length(filename),0)

    reg_list = repeat(0,10)

    reg_list[REG_AX] = #4100
    reg_list[REG_DS] = floor(buff/16)
    reg_list[REG_DX] = remainder(buff,16)

    reg_list = dos_interrupt(#21,reg_list)
    free_low(buff)

    if remainder(reg_list[REG_FLAGS],2) != 0 then
        puts(1, "DOS error number :")
        print(1,reg_list[REG_AX])
        puts(1,"\n")
        return 0
    else
        return 1
    end if
end function

--------END OF CODE--------

--

            ************************************
            This message sent by Daniel Berstein
            ************************************
     email: architek at geocities.com
 homepages: http://www.geocities.com/SiliconValley/Heights/9316
            http://www.cybercity.hko.net/silicon_valley/architek

new topic     » topic index » view message » categorize

2. Re: Deleting a file

On Mon, 28 Apr 1997 19:09:12 -0400 Architek <architek at GEOCITIES.COM>
writes:
>
>Hi, I've got a problem:
>I need to delete a file, but don't want to use the system() function,
>cause it has to be "transparent" to the user.
>
>            ************************************
>            This message sent by Daniel Berstein
>            ************************************
>     email: architek at geocities.com

If you are doing it from text mode then you can make your active
page, 1 or 2 or something other than your display page which
I believe is 0 by default.  ONLY problem there is that I believe
your error message will pop up on page 0.  NOT sure.
Check it out.  You should have no problem using this with DOS
commands such as copy.

I am under ver 6.22 of DOS.  My del doesn't return anything.
unless the file isn't found.

You should use:
  file = "filename.tmp"
  system("del "& file, 2)
OR
  system("del filename.tmp", 2)

Since delete doesn't display anything you
can do it under Text or Graphics mode.

Hope this helps

--Lucius Lamar Hilley III
--  E-mail at luciuslhilleyiii at juno.com
--  I support transferring of files less than 60K.
--  I can Decode both UU and Base64 format.

new topic     » goto parent     » topic index » view message » categorize

3. Re: Deleting a file

Architek wrote:

I tested your function and got an dosserror 3. It meant that is could
not find the path. So I tried it with a path and my file was deleted.

Marcel Kollenaar

--Code --

include machine.e

-- SYS_DEL()
-- Uses DOS INT #21, service #41 to delete a file given an ASCIIZ
filename
-- Returns 1 if succesfull, else return 0 and displays DOS error code
with trace
-- INT reference: HelpPC 2.1
function sys_del(sequence filename)
    sequence reg_list
    integer buff

    buff = allocate_low(length(filename)+1)
    poke(buff,filename)
    poke(buff+length(filename),0)

    reg_list = repeat(0,10)

    reg_list[REG_AX] = #4100
    reg_list[REG_DS] = floor(buff/16)
    reg_list[REG_DX] = remainder(buff,16)

    reg_list = dos_interrupt(#21,reg_list)
    free_low(buff)

    if remainder(reg_list[REG_FLAGS],2) != 0 then
        puts(1, "DOS error number :")
        print(1,reg_list[REG_AX])
        puts(1,"\n")
        return 0
    else
        return 1
    end if
end function
trace(1)
integer a
a = sys_del("c:\\euphoria\\pex\\test.asc")

new topic     » goto parent     » topic index » view message » categorize

4. Re: Deleting a file

Architek writes:

-- snip -----
 buff = allocate_low(length(filename)+1)
 poke(buff,filename)
 poke(buff+length(filename),0)
--------------------------------------------------------

I was wondering if the last line should not read:
        poke(buff + length(filename) + 1, 0)
                                     ^^^^
Am I right or am I right?

Hope this helps

Ad Rienks

new topic     » goto parent     » topic index » view message » categorize

5. Re: Deleting a file

Ad Rienks wrote:

> -- snip -----
>  buff = allocate_low(length(filename)+1)
>  poke(buff,filename)
>  poke(buff+length(filename),0)
> --------------------------------------------------------
>
> I was wondering if the last line should not read:
>         poke(buff + length(filename) + 1, 0)
>                                      ^^^^
> Am I right or am I right?

        I don't thinks so... give them numbers:
filename = "myfile" (length = 6)
bytes allocated: 6 + 1 = 7 bytes (lets give buff any address: 10 to 16)
poke(10,"myfile") ---> pokes bytes 10,11,12,13,14,15
poke(10+6,0) = poke(16,0) --> Which is defenitly the right offset of buff

I don't know if you understand my demostration, but if you didn't... the
original way is right, you must understand that offsets start from '0'.

Thanks anyway,
--

            ************************************
            This message sent by Daniel Berstein
            ************************************
     email: architek at geocities.com
 homepages: http://www.geocities.com/SiliconValley/Heights/9316
            http://www.cybercity.hko.net/silicon_valley/architek

new topic     » goto parent     » topic index » view message » categorize

6. Re: Deleting a file

--=====================_862467637==_

At 19:09 97-04-28 -0400, Daniel Berstein wrote:

>I need to delete a file, but don't want to use the system() function,
>cause it has to be "transparent" to the user. So I got this bright
>idea of using DOS interrupts (#21). At the end is the code I used, but
>it doesn't work... I keep getting DOS error 2 (file not found) and
>5 (access denied). Can anyone tell me what is wrong? Is there any
>other way to that?
>I also needed to copy a file but I solve that with a loop of getc() and
>puts() until an EOF.. is there another eficient way?
>
>Thanks.
>
>
>-------------CUT HERE--------------
>
>-- SYS_DEL()
>-- Uses DOS INT #21, service #41 to delete a file given an ASCIIZ filename
>-- Returns 1 if succesfull, else return 0 and displays DOS error code
>
>-- INT reference: HelpPC 2.1
>function sys_del(sequence filename)
>    sequence reg_list
>    integer buff
>
>    buff = allocate_low(length(filename)+1)
>    poke(buff,filename)
>    poke(buff+length(filename),0)
>
>    reg_list = repeat(0,10)
>
>    reg_list[REG_AX] = #4100
>    reg_list[REG_DS] = floor(buff/16)
>    reg_list[REG_DX] = remainder(buff,16)
>
>    reg_list = dos_interrupt(#21,reg_list)
>    free_low(buff)
>
>    if remainder(reg_list[REG_FLAGS],2) != 0 then
>        puts(1, "DOS error number :")
>        print(1,reg_list[REG_AX])
>        puts(1,"\n")
>        return 0
>    else
>        return 1
>    end if
>end function
>
>--------END OF CODE--------

I tested it on my computer without any problem.

I attached copy.ex  which use dos interrupt #21  to copy a file. You need
doswrap.e
to use it. If you don't have it you can find it on Euphoria Official home
page or
drop me an e-mail I'll send it to you.


--=====================_862467637==_

-- copying file demo.
include doswrap.e

constant BUFF_SIZE = power(2,15)
function CopyFile(sequence Source, sequence Dest)
atom buffer
integer   FSrc, FDest, NbRead, junk

    FSrc = DosOpen(Source,READ)
    if FSrc = -1 then
        return 0
    end if
    FDest = DosCreate(Dest,0)
    if FDest = -1 then
        return 0
    end if
    buffer = allocate_low(BUFF_SIZE)
    if buffer = 0 then
        return 0
    end if
    NbRead = BlockRead(FSrc,buffer,BUFF_SIZE)
    while NbRead > 0 do
        if BlockWrite(FDest,buffer,NbRead) = -1 then
          junk = DosClose(FSrc)
          junk = DosClose(FDest)
          free_low(buffer)
          return 0
        end if
       NbRead = BlockRead(FSrc,buffer,BUFF_SIZE)
    end while
    junk = DosClose(FSrc)
    junk = DosClose(FDest)
    free_low(buffer)
    return 1
end function


--=====================_862467637==_

Jacques Deschenes
Baie-Comeau, Quebec
Canada
desja at quebectel.com

--=====================_862467637==_--

new topic     » goto parent     » topic index » view message » categorize

7. Re: Deleting a file

Jacques Deschenes wrote:

> I tested it on my computer without any problem.

        Ooops, I made the function OK, but I just realized I was calling it
bad... I used '\' instaed of '\\' for the file path :P Stupid thing!!!

> I attached copy.ex  which use dos interrupt #21  to copy a file. You need
> doswrap.e
> to use it. If you don't have it you can find it on Euphoria Official home
> page or
> drop me an e-mail I'll send it to you.

        Thanks, I got your files.
--

            ************************************
            This message sent by Daniel Berstein
            ************************************
     email: architek at geocities.com
 homepages: http://www.geocities.com/SiliconValley/Heights/9316
            http://www.cybercity.hko.net/silicon_valley/architek

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu