Written by

Developer at AGIMERO GmbH
Question Fabio Care · May 25, 2022

%File Delete not Working

Hey there,

I'm writing an import Routine to read files into a global. The code is working fine except for the 'Delete' command. The files are being imported, copied but not deleted. Maybe someone has an Idea what ist happening.

I get the low level return value of -32 but i couldn't find anywhere to show me what that actually means. And my Caché version doesn't support the $ZU command.

Here's the Code

WWWFILEIMPORT
 PATH,FILE,ARCHIVPATH,FAILPATH
 SET PATH="C:\inetpub\ftproot\File_Import\"
 SET ARCHIVPATH="C:\inetpub\ftproot\File_Import\Imported\"
 SET FAILPATH="C:\inetpub\ftproot\File_Import\Failed\"
 set FILE=$ZSEARCH(PATH_"*")
 WHILE FILE'="" {
 FILESTART,FILENAME
 SET FILESTART=$LENGTH(FILE)+2-$FIND($REVERSE(FILE),"\")
 SET FILENAME=$E(FILE,FILESTART+1,99999)
   
 IF $G(FILENAME)'="" IF $G(FILENAME)'="." IF $G(FILENAME)'=".." IF $F(FILENAME,".") DO
   .STREAM,SC,LINE,DATA,LIMIT
   .SET LIMIT=0
   .SET STREAM=##class(%Stream.FileCharacter).%New()
   .SET SC=STREAM.LinkToFile(FILE)
   .DO STREAM.Rewind()
   .SET DATA=""
   .WHILE 'STREAM.AtEnd {
   .SET LINE=STREAM.ReadLine()
   .IF ($L(DATA)+$L(LINE))>3600000 SET LIMIT=-1
   .IF LIMIT=-1 Q
       .SET DATA=DATA_LINE_$C(13)_$C(10)
    .}
    .
    .IF LIMIT=0 IF $G(DATA)'="" SET ^WWWFILE(0,FILENAME,1)=$G(DATA)
    .
    .
    .
    .IF LIMIT'=-1 DO ##class(%File).CopyFile(FILE,ARCHIVPATH)
    .IF LIMIT=-1 DO ##class(%File).CopyFile(FILE,FAILPATH)
    .
    .do ##class(%File).Delete(FILE, .RETURN)
    .FILE_$C(13)_$C(10)
    .RETURN
    .
    .Q
 
 SET FILE=$ZSEARCH("")
 }
 Q

 Output for a single file is: 

C:\inetpub\ftproot\File_Import\app-debug.apk
-32

Thank you for any advice.

Product version: Caché 2017.1
$ZV: Cache for Windows (x86-64) 2017.2 (Build 744U) Fri Sep 29 2017 10:58:27 EDT

Comments

Julius Kavay · May 25, 2022
...
.SET SC=STREAM.LinkToFile(FILE)   // A
...
...
.do##class(%File).Delete(FILE, .RETURN)  // B

As long you hold your hand on a file (line A), you can't delete the file (line B). You have to do something like

set SC = ""// orkill SC
0
Julius Kavay  May 25, 2022 to Julius Kavay

Bye the way, non of Cache/IRIS has an $ZU command but all versions have a bunch of $ZU() functions. So what do you want to do with them?

0
Fabio Care  May 25, 2022 to Julius Kavay

I read some random post in the community that said you could evaluate the low level return with the $ZU() command. But maybe that was something different

0
Fabio Care  May 25, 2022 to Julius Kavay

Neither of those command worked, that was what I thoguht at first too. But killing the STREAM did the trick, so you pointed me in the right direction. Thanks. 

0
Robert Cemper · May 25, 2022

Check acces rights to the files.
Especially for the Windows USER your Caché installation is runing on. 

0
Eduard Lebedyuk · May 25, 2022

Windows error codes are here.

ERROR_SHARING_VIOLATION

32 (0x20)

The process cannot access the file because it is being used by another process.

0
Fabio Care  May 25, 2022 to Eduard Lebedyuk

oh nice, thanks! 

0