The source code for the DLL is included in qq.zip, as is quotequad.dll. The next step is for you to replicate the whole demonstration for yourself, using the source code, and then to write more purposeful methods and properties. In order to accomplish this, you will need a good reference on C# and an understanding of the conventions relating to COM objects. Also, use the quotequad.dll to test the deployment technique discussed above.
References
[1] http://msdn.microsoft.com/vstudio/express/visualcsharp/download/default.aspx
[2] http://www.microsoft.com Search for dot net framework 2.0 redistributable
[3] C. Nagel, B. Evjen, J. Glynn, M. Skinner, K. Watson & A. Jones, Professional C# 2005, WROX, ISBN-13 978-0-7645-7534-1
[4] Ajay Askoolum, System Building with APL+Win, John Wiley,
ISBN 0-470-03020-8
Zipping and Unzipping Files in APL+Win A Basic guide to using Windows XP
file compression facilities from APL+Win
by Ajay Askoolum (ajayaskoolum@ntlworld.com)
Verify File
Verify whether a file exists using PathFileExists; this is an API call. If this declaration is not found in your INI file, add it, thus:
⎕wcall 'W_Ini' '[Call]PathFileExists=L(*C pszPath) ALIAS PathFileExistsA LIB shlwapi.dll'
The test to verify declaration is:
⍴⎕wcall 'W_Ini' '[Call]PathFileExists' ⍝ 0 = Missing
An empty Zip file can be created using the following function:
∇ Z←CreateZipFile R
[1] ⍝ Ajay Askoolum
[2] :if 0=⎕wcall 'PathFileExists' R
[3] R ⎕xncreate Z←¯1+⌊/0,⎕nnums,⎕xnnums
[4] ('PK¨←',(18⍴⎕tcnul),⎕tcnl,⎕tclf) ⎕nappend Z
[5] ⎕nuntie Z
[6] Z←1
[7] :else
[8] Z←0
[9] :endif
∇
This function returns 1 if successful and 0 otherwise; the right-hand argument is a fully qualified filename.
CreateZipFile 'c:\ajayAskoolum.zip'
1
Signature of Zip File
The first 22 bytes of the file varies, depending on the application that created the Zip file. A file created thus can be used by WinZip. You can write a function to verify whether a particular file is a ZIP file by matching the first 4 bytes – see line [4].
The following function will add a list of files to an existing Zip file:
∇ Z←L AddToZip R;⎕wself
[1] ⍝ Ajay Askoolum
[2] ⍝ L = Fully qualified name of an existing and valid Zip file
[3] ⍝ R is a list of files to add or refresh inside ZIP
[4] :if 0=⍴'ShApp' ⎕wi 'self'
[5] ⎕wself←'ShApp' ⎕wi 'Create' 'Shell.Application'
[6] :else
[7] ⎕wself←'ShApp'
[8] :endif
[9] :while 0≠⍴R←,R
[10] ⎕wi 'xNamespace().CopyHere' L (⎕io⊃R)
[11] R←1↓R
[12] :endwhile
∇
Note that the function does not delete the instance of the Shell Application object; this is deliberate and intended to save time creating the object when the function is used repeatedly.
⍝ Add a single file
'c:\ajayaskoolum.zip' AddToZip
⊂'c:\Comparing the Excel COM Interface.doc'
⍝ Add multiple files
files←'C:\aa(2)\DSC00001.JPG' 'C:\OURFILES\AJAY\APL\SHELL\SHELL.W3'
'c:\ajayaskoolum.zip' AddToZip files
The file can be opened by WinZip; see below.
List File Names in Zip File
The list of files in a given Zip file can be returned by this function:
∇ Z←L EnumZip R;⎕wself;i;j
[1] ⍝ Ajay Askoolum
[2] ⍝ Return list of files found in Zip file R
[3] :if 0=⍴'ShApp' ⎕wi 'Self'
[4] ⎕wself←'ShApp' ⎕wi 'Create' 'Shell.Application'
[5] :else
[6] ⎕wself←'ShApp'
[7] :endif
[8] Z←0/⊂''
[9] :if 0≠⎕wi 'xNamespace()' R ⍝ Verify existence
[10] ⎕wi 'xNamespace().Items>.tr' R
[11] :if 0≠i←'.tr' ⎕wi 'xCount'
[12] i←(-⎕io)+⍳i
[13] j←(⊂'.tr') ⎕wi¨ (⊂⊂'xItem().Path'),¨i ⍝ Contents
[14] L←(⊂'.tr') ⎕wi¨ (⊂⊂'xItem().IsFolder'),¨i
[15] Z←Z,(~L)/j ⍝ Files
[16] :if 0≠⍴L←L/j ⍝ Folders
[17] R←(1≥+\'\'=R)/R
[18] Z←Z,⊃,/EnumZip ¨(⊂R,'\'),¨L
[19] :endif
[20] :endif
[21] :endif
[22] :if 1=+/'EnumZip'^.⍉⎕si[;⍳7]
[23] :if 0≠⍴'.tr' ⎕wi 'self'
[24] '.tr' ⎕wi 'Delete'
[25] :endif
[26] :endif
∇
Note that this is a recursive function.
EnumZip 'c:\ajayaskoolum.zip'
Comparing the Excel COM Interface.doc DSC00001.JPG SHELL.w3
⍴EnumZip 'c:\ajayaskoolum.zip'
3
⊃EnumZip 'c:\ajayaskoolum.zip'
Comparing the Excel COM Interface.doc
DSC00001.JPG
SHELL.w3
The following function will extract the files from an existing Zip file into a specified location:
∇ L ExtractZip R;⎕wself
[1] ⍝ Ajay Askoolum
[2] ⍝ L is the target location for extracted files
[3] ⍝ R is the fully qualified name of Zip file
[4] :if 0=⍴'ShApp' ⎕wi 'self'
[5] ⎕wself←'ShApp' ⎕wi 'Create' 'Shell.Application'
[6] :else
[7] ⎕wself←'ShApp'
[8] :endif
[9] ⎕wi 'NameSpace().CopyHere' L ((⎕wi 'NameSpace().Items' R) ⎕wi 'obj')
∇
'c:\zzz' ExtractZip 'c:\ajayaskoolum.zip'
⎕lib 'c:\zzz'
Comparing the Excel COM Interface.doc
DSC00001.JPG
SHELL.w3
Note that the target location must exist.
What is Missing?
Lots! If you examine the properties, methods, and events of the Shell object, it is clear that this object does not expose the compression properties or methods. It is possible to do lots more with these facilities; I’ll leave you to explore.
Analysing CONTINUE Workspaces A light-hearted look at the Dyalog CONTINUE
workspace, and what to do with it
by Ray Cannon (ray_cannon@compuserve.com)
[This article contains annoying and exuberant references to obscure artefacts of British culture, inappropriate to a serious journal of international reputation. Our first scheme was liposuction: to edit them out as waste tissue. However, investigation revealed them inseparable from the skeleton and sinews of this piece. With the deepest regret, we print them as submitted. Ed.]
They sought it with thimbles, they sought it with care;
They pursued it with forks and hope;
I just tried googling for “continue.dws” and came up with a mere “7 English pages”, none of which appeared to be related to Dyalog APL. So, not many people out there in the Wild Word World of Googleland appear to know about Dyalog’s CONTINUE workspace.
But we all know it is what you get when you cross a bug in a workspace with the Dyalog runtime interpreter.
Share with your friends: |