FileOpen2: Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
m (moved FileOpenEx to FileOpen2: Changing the name of the function, looked too advanced. Reminds me of the method of the same name from ms ( http://msdn.microsoft.com/en-us/library/ff867007.aspx )) |
|||
(8 intermediate revisions by one other user not shown) | |||
Line 2: | Line 2: | ||
== Description == | == Description == | ||
Open files with control over <b><i>access</i></b>, <b><i>share</i></b> and <b><i>create</i></b> modes with | Open files with control over <b><i>access</i></b>, <b><i>share</i></b> and <b><i>create</i></b> modes with intuitive parameters. | ||
== Example == | == Example == | ||
<highlight-nsis>;; Open file with RW access, ReadOnly sharing, and if it does not exists, Creates it. $1 gets the file handle. | <highlight-nsis>;; Open file with RW access, ReadOnly sharing, and if it does not exists, Creates it. $1 gets the file handle. | ||
${ | ${FileOpen2} $1 "$SomeFile" "w" "r" "c"</highlight-nsis> | ||
== Function == | == Function == | ||
<highlight-nsis>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | <highlight-nsis>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
;; Easily open files with more options than FileOpen | ;; Easily open files with more options than FileOpen. Use lowercase modes | ||
;; P1 : | ;; P1 :out: Handle | ||
;; P2 : | ;; P2 :in: File name | ||
;; P3 : | ;; P3 :in: Access mode (default=r) | ||
;; | ;; 'r' : Read | ||
;; | ;; 'w' : Read+Write | ||
;; P4 :in: Share mode (default=w) | |||
;; P4 : | ;; 'l' : None (full lock) | ||
;; | ;; 'r' : Read (no delete, no write) | ||
;; | ;; 'w' : Read+Write (no delete) | ||
;; | ;; 'a' : Read+Write+Delete (full share) | ||
;; | ;; P5 :in: Create mode (default=o) | ||
;; P5 : | ;; 'o' : Open existing only | ||
;; | ;; 'c' : Create if not exist | ||
;; | ;; 'v' : Create and Overwrite | ||
;; | |||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
!define | !define FileOpen2 "!insertmacro _FileOpen2" | ||
!macro | !macro _FileOpen2 _Handle_ _File_ _Access_ _Share_ _Create_ | ||
Push "${_Create_}" | Push "${_Create_}" | ||
Push "${_Share_}" | Push "${_Share_}" | ||
Push "${_Access_}" | Push "${_Access_}" | ||
Push "${_File_}" | Push "${_File_}" | ||
Call | Call FileOpen2 | ||
Pop ${_Handle_} | Pop ${_Handle_} | ||
!macroend | !macroend | ||
Function | Function FileOpen2 ;; File, Access, Share, Create | ||
Exch $0 | Exch $0 ;; File | ||
Exch | Exch | ||
Exch $1 | Exch $1 ;; Access | ||
Exch 2 | Exch 2 | ||
Exch $2 | Exch $2 ;; Share / Return value | ||
Exch 3 | Exch 3 | ||
Exch $3 | Exch $3 ;; Create | ||
StrCmpS "w" $1 0 +3 | |||
StrCpy $1 0xC0000000 ;; GENERIC_READ | GENERIC_WRITE | |||
Goto +2 | |||
;- else: "r", "", or anything else | |||
StrCpy $1 0x80000000 ;; GENERIC_READ | StrCpy $1 0x80000000 ;; GENERIC_READ | ||
StrCmpS "l" $2 0 +3 | |||
StrCpy $2 0 ;; FILE_SHARE_NONE | StrCpy $2 0 ;; FILE_SHARE_NONE | ||
Goto + | Goto +8 | ||
StrCmpS "r" $2 0 +3 | |||
StrCpy $2 1 ;; FILE_SHARE_READ | StrCpy $2 1 ;; FILE_SHARE_READ | ||
Goto + | Goto +5 | ||
StrCmpS "a" $2 0 +3 | |||
StrCpy $2 7 ;; FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE | |||
;- else: "w", "", or anything else | |||
StrCpy $2 3 ;; FILE_SHARE_READ | FILE_SHARE_WRITE | StrCpy $2 3 ;; FILE_SHARE_READ | FILE_SHARE_WRITE | ||
Goto + | Goto +2 | ||
StrCmpS "v" $3 0 +3 | |||
StrCpy $3 2 ;; CREATE_ALWAYS | |||
Goto +5 | |||
StrCmpS "c" $3 0 +3 | |||
StrCpy $3 4 ;; OPEN_ALWAYS | |||
Goto +2 | |||
;- else: "o", "", or anything else | |||
StrCpy $3 3 ;; OPEN_EXISTING | StrCpy $3 3 ;; OPEN_EXISTING | ||
System::Call 'Kernel32::CreateFile(t, i, i, i, i, i, i) i (r0, r1, r2, 0, r3, 0x80, 0) .r2' ;; Open/Create file | System::Call 'Kernel32::CreateFile(t, i, i, i, i, i, i) i (r0, r1, r2, 0, r3, 0x80, 0) .r2' ;; Open/Create file | ||
Line 80: | Line 77: | ||
Pop $0 | Pop $0 | ||
Pop $1 | Pop $1 | ||
Exch $2 | Exch $2 ;; Return Handle | ||
FunctionEnd</highlight-nsis> | FunctionEnd</highlight-nsis> | ||
[[Category:Disk, Path & File Functions]] | [[Category:Disk, Path & File Functions]] |
Latest revision as of 14:56, 3 December 2011
Author: Lloigor (talk, contrib) |
Description
Open files with control over access, share and create modes with intuitive parameters.
Example
;; Open file with RW access, ReadOnly sharing, and if it does not exists, Creates it. $1 gets the file handle. ${FileOpen2} $1 "$SomeFile" "w" "r" "c"
Function
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Easily open files with more options than FileOpen. Use lowercase modes ;; P1 :out: Handle ;; P2 :in: File name ;; P3 :in: Access mode (default=r) ;; 'r' : Read ;; 'w' : Read+Write ;; P4 :in: Share mode (default=w) ;; 'l' : None (full lock) ;; 'r' : Read (no delete, no write) ;; 'w' : Read+Write (no delete) ;; 'a' : Read+Write+Delete (full share) ;; P5 :in: Create mode (default=o) ;; 'o' : Open existing only ;; 'c' : Create if not exist ;; 'v' : Create and Overwrite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; !define FileOpen2 "!insertmacro _FileOpen2" !macro _FileOpen2 _Handle_ _File_ _Access_ _Share_ _Create_ Push "${_Create_}" Push "${_Share_}" Push "${_Access_}" Push "${_File_}" Call FileOpen2 Pop ${_Handle_} !macroend Function FileOpen2 ;; File, Access, Share, Create Exch $0 ;; File Exch Exch $1 ;; Access Exch 2 Exch $2 ;; Share / Return value Exch 3 Exch $3 ;; Create StrCmpS "w" $1 0 +3 StrCpy $1 0xC0000000 ;; GENERIC_READ | GENERIC_WRITE Goto +2 ;- else: "r", "", or anything else StrCpy $1 0x80000000 ;; GENERIC_READ StrCmpS "l" $2 0 +3 StrCpy $2 0 ;; FILE_SHARE_NONE Goto +8 StrCmpS "r" $2 0 +3 StrCpy $2 1 ;; FILE_SHARE_READ Goto +5 StrCmpS "a" $2 0 +3 StrCpy $2 7 ;; FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ;- else: "w", "", or anything else StrCpy $2 3 ;; FILE_SHARE_READ | FILE_SHARE_WRITE Goto +2 StrCmpS "v" $3 0 +3 StrCpy $3 2 ;; CREATE_ALWAYS Goto +5 StrCmpS "c" $3 0 +3 StrCpy $3 4 ;; OPEN_ALWAYS Goto +2 ;- else: "o", "", or anything else StrCpy $3 3 ;; OPEN_EXISTING System::Call 'Kernel32::CreateFile(t, i, i, i, i, i, i) i (r0, r1, r2, 0, r3, 0x80, 0) .r2' ;; Open/Create file Pop $3 Pop $0 Pop $1 Exch $2 ;; Return Handle FunctionEnd