Just starting out? Need help? Post your questions and find answers here.
trather
User
Posts: 29 Joined: Sun Nov 07, 2004 9:57 pm
Post
by trather » Sun Feb 10, 2008 8:41 pm
I am having trouble understanding why this code keeps failing. It is a simple copy command using the windows API function. I like to use it because is as the progress bar and icon all in one. Here is the code. I can get it to work if I code the file path my self. You will see that it is remarked out now but if I use the other function to get the same path it will fail. I have checked and the name is the same. I am open for suggestions.
Code: Select all
Procedure.s Win_Spec_Loc(Valeur.l)
;Based on Droopy Library v1.31.4
;Modified to no have a \ at the end
If SHGetSpecialFolderLocation_(0, Valeur, @TR_ID) = 0
SpecialFolderLocation.s = Space(#MAX_PATH)
SHGetPathFromIDList_(TR_ID, @SpecialFolderLocation)
EndIf
ProcedureReturn SpecialFolderLocation.s
EndProcedure
Procedure.b CpyDir(FromLoc.s, Toloc.s)
Switches.SHFILEOPSTRUCT ;Windows API Structure
File_From.s = FromLoc
File_Dest.s = Toloc
Switches\wFunc = #FO_COPY
Switches\pFrom = @File_From
Switches\pTo = @File_Dest
Switches\fFlags = #FOF_NOCONFIRMATION | #FOF_NOCONFIRMMKDIR
Result.l = SHFileOperation_(@Switches)
; If cancel was pressed then result will NOT be zero (0)
EndProcedure
Procedure Main()
Dir_From.s =Win_Spec_Loc(6)
;Dir_From.s = "C:\Documents and Settings\Todd\Favorites"
Dir_To.s = "C:\Todd1234"
Error.b = CpyDir(Dir_From,Dir_To)
If Error =#False : A$= "Cancel" : End : Else : A$ = "Sucessful" :EndIf
EndProcedure
Main()
akj
Enthusiast
Posts: 668 Joined: Mon Jun 09, 2003 10:08 pm
Location: Nottingham
Post
by akj » Sun Feb 10, 2008 9:25 pm
The documentation for SHFileOperation_() say that Switches\pFrom and Switches\pTo both need to end in 2 trailing nulls, but you have not done that.
See also
http://www.purebasic.fr/english/viewtopic.php?t=3783
Anthony Jordan
srod
PureBasic Expert
Posts: 10589 Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...
Post
by srod » Sun Feb 10, 2008 9:38 pm
akj just beat me as I was adjusting your code, but the following works okay and does exactly what akj was infering etc.
Code: Select all
Procedure.s Win_Spec_Loc(Valeur.l)
;Based on Droopy Library v1.31.4
;Modified to no have a \ at the end
If SHGetSpecialFolderLocation_(0, Valeur, @TR_ID) = 0
SpecialFolderLocation.s = Space(#MAX_PATH)
SHGetPathFromIDList_(TR_ID, @SpecialFolderLocation)
EndIf
ProcedureReturn SpecialFolderLocation.s
EndProcedure
Procedure.l CpyDir(FromLoc.s, Toloc.s)
Switches.SHFILEOPSTRUCT ;Windows API Structure
;The filename needs to be double null-terminated.
temp1$=Space(#MAX_PATH+SizeOf(character))
RtlZeroMemory_(@temp1$, #MAX_PATH+SizeOf(character))
PokeS(@temp1$, FromLoc)
temp2$=Space(#MAX_PATH+SizeOf(character))
RtlZeroMemory_(@temp2$, #MAX_PATH+SizeOf(character))
PokeS(@temp2$, ToLoc)
; File_Dest.s = Toloc +Chr(0)+Chr(0)
Switches\wFunc = #FO_COPY
Switches\pFrom = @temp1$
Switches\pTo = @temp2$
Switches\fFlags = #FOF_NOCONFIRMATION
Result.l = SHFileOperation_(@Switches)
; If cancel was pressed then result will NOT be zero (0)
EndProcedure
Procedure Main()
Dir_From.s =Win_Spec_Loc(6) +"\*.*"
Dir_To.s = "C:\Todd1234"
CreateDirectory(Dir_To)
Error.b = CpyDir(Dir_From,Dir_To)
If Error =#False : A$= "Cancel" : End : Else : A$ = "Sucessful" :EndIf
EndProcedure
Main()
Last edited by
srod on Sun Feb 10, 2008 10:27 pm, edited 1 time in total.
I may look like a mule, but I'm not a complete ass.
SFSxOI
Addict
Posts: 2970 Joined: Sat Dec 31, 2005 5:24 pm
Location: Where ya would never look.....
Post
by SFSxOI » Sun Feb 10, 2008 9:54 pm
;The filename needs to be double null-terminated.
??? why?
srod
PureBasic Expert
Posts: 10589 Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...
Post
by srod » Sun Feb 10, 2008 9:57 pm
You can pass multiple filenames to these functions and individual filenames must be null-terminated. A double-null is then used to terminate the entire list of filenames etc.
I may look like a mule, but I'm not a complete ass.
trather
User
Posts: 29 Joined: Sun Nov 07, 2004 9:57 pm
Post
by trather » Tue Feb 12, 2008 4:07 am
Thank you. I was not aware of the double Null that was needed.
SFSxOI
Addict
Posts: 2970 Joined: Sat Dec 31, 2005 5:24 pm
Location: Where ya would never look.....
Post
by SFSxOI » Tue Feb 12, 2008 8:27 am
If your using Vista, you can do multiple operations of different types in a single call (without the need for double null's) using the new Vista API IFileOperation interface.
http://www.purebasic.fr/english/viewtopic.php?t=31094