webForumDet fria alternativet

moveFolder och subfolders till ickeskapade kataloger

ASP

5 svar · 268 visningar · startad av Mattias Nordin

Medlem sedan dec. 20051 056 inlägg
Frågan#1

Hej,

Jag undrar hur man gör för att flytta filer till en icke skapad sökväg. Jag får det att fungera om jag bara har en ny katalog i den nya sökvägen men om jag har flera så får jag...

Microsoft VBScript runtime error '800a0005'
Invalid procedure call or argument

Behöver man manuellt loopa och skapa katalogerna i den nya sökvägen eller ska "objFso.MoveFolder" klara av att skapa katalogstrukturen i den nya sökvägen?

Jag använder mig av följande kod...

set objFso = CreateObject("Scripting.FileSystemObject") 
response.write("<li> Flyttar katalogen från " &server.mappath(sRelativeFolderPath_current) &" till " & server.mappath(sRelativeFolderPath))
objFso.MoveFolder server.mappath(sRelativeFolderPath_current), server.mappath(sRelativeFolderPath)

När
sRelativeFolderPath_current = D:\fileroot\photos\2007
och
sRelativeFolderPath = D:\fileroot\photos\2007\test\

så fungerar det, men inte när

sRelativeFolderPath_current = D:\fileroot\photos\2007
och
sRelativeFolderPath = D:\fileroot\photos\2007\test\test2\test3\

Please, educate me :stud

Medlem sedan juni 20003 076 inlägg
#2

Om inte jag är helt vimsig i skallen så är det både teoretiskt och fysiskt omöjligt att flytta en mapp till en undermapp på det viset. Det kan du inte heller göra i windows.
Du får dela upp i flera steg:
1. Flytta filer: D:\fileroot\photos\2007 -> D:\fileroot\photos\_2007\test\test2\test3
2. Flytta igen: D:\fileroot\photos\_2007 -> D:\fileroot\photos\2007
Då kommer nya mappen 2007 att innehålla testmapparna. :)

Medlem sedan dec. 20051 056 inlägg
#3

Det går faktiskt alldeles utmärkt att skapa mappar på det sättet. Jag har dock inte provat att flytta filer i CMD på länge men då det fungerar att skapa mappar +undermappar +undermappar med...

mkdir "test1\test2\test3"

så borde det vara möjligt att även move kunde det tycker jag. Skulle vara trevligt om vbscripts moveFolder fungerade likadant. Varför nöja sig med att bara skapa en katalog när all data finns för att skapa alla ?¿

Men det är min åsikt... den stämmer inte alltid med giltig syntax *ler*

Medlem sedan juni 20003 076 inlägg
#4

Mm, fast mkdir eller skapa mapp, det är inte samma sak som att flytta.
Testa detta så får du se:
1. Skapa en ny mapp på ditt skrivbord
2. Skapa en till mapp i den mappen.
3. Prova att flytta första mappen in i den andra!

Som i ditt fall så vill du ju flytta 2007 in i sig själv!

Medlem sedan dec. 20051 056 inlägg
#5

Jag förstår hur du tänker. Man kan inte radera grenen man sitter på :)

Men det är inte igentligen det jag vill göra. Jag vill igentligen kunna kopiera kataloger och filer till en sökväg där sökvägen består av flera ickeskapade kataloger.

Nu har jag skapat en egen funktion som klarar att flytta filer till en icke ännu existerande sökväg som är mer än en katalog djup. Antar att det är någon fiffig programmerare som kommer på någon bättre metod än nedan men detta duger för mig. Tycker fortfarande att allt i min funktion kunde vara inbakat i MoveFile och CopyFile.

<%
call funMoveOrCopyFiles("copy", "\A\test2.asp","\A\B\C\D\E\F\test.asp") 
'call funMoveOrCopyFiles("move", "\A\test2.asp","\A\B\C\D\E\test.asp")
 %>
<% function funMoveOrCopyFiles(iCopyOrMove, iRelativeFrom, iRelativeTo)
	
'1)	-	CREATE FILE SYSTEM OBJECT...
		Set objFso = CreateObject("Scripting.FileSystemObject")
		
'2)	-	VERIFY THAT FROM TO ADDRESS IS A RELATIVE PATH...
		if instr(iRelativeFrom,"\") = 1 then
			'response.write("<li> iRelativeFrom = " &iRelativeFrom)
		else
			varError = "<li><font color=red>ERROR. The FROM path must start with \</font>"
		end if
		
'2)	-	VERIFY THAT THE TO ADDRESS IS A RELATIVE PATH...
		if instr(iRelativeTo,"\") = 1 then
		 	iRelativeTo = right(iRelativeTo,len(iRelativeTo)-1)
			'response.write("<li> iRelativeTo = " &iRelativeTo)
		else 
			varError = "<li><font color=red>ERROR. The TO path must start with \</font>"
		end if 
		
'3)	-	GET A LIST OFF ALL TARGET FOLDERS...
		myArray = Split(iRelativeTo,"\")
		
'4)	-	LOOP THROUGH ALL FOLDERS AND TEST IF THEY EXIST. IF NOT, CREATE THEM.
		for i = lBound(myArray) to uBound(myArray) 
		
	'4.1)	-	SKIP FILENAME...
				if inStr(myArray(i),".") <= 0  AND varError = "" then
					
					iRelativeToFolder = iRelativeToFolder &"\" &myArray(i)
					if objFso.FolderExists(server.mappath(iRelativeToFolder)) Then 
						'Folder allready exist. Skip it or do something cool below...
					else 
			'4.2)	-	CREATE FOLDER...
						objFSO.CreateFolder(server.mappath(iRelativeToFolder))
					end if 
				
				end if
 		next
		
'4)	-	COPY THE FILE...
		if varError = "" then 
			if lCase(iCopyOrMove) = "move" then 	
				'response.write("<p><li>MOVE  " &server.mappath(iRelativeFrom) &" , " &server.mappath("\" &iRelativeTo))
				call objFSO.MoveFile(server.mappath(iRelativeFrom),server.mappath("\" &iRelativeTo))
			elseif lCase(iCopyOrMove) = "copy" then
				'response.write("<p><li>COPY  " &server.mappath(iRelativeFrom) &" , " &server.mappath("\" &iRelativeTo))
				call objFSO.CopyFile(server.mappath(iRelativeFrom),server.mappath("\" &iRelativeTo))
			else
			varError = varError &"<font color=red> Incorrect input. Syntax = &nbsp; call funAddFolderAndSubfolders(""copy"", ""relativeFromPath"", ""relativeToPath"") "
			end if 
		end if
		
'5)	-	OUTPUT ANY ERRORS...
response.write(varError)
end function %>
Medlem sedan dec. 20051 056 inlägg
#6

En variant som även klarar av att flytta / kopiera kataloger. Hyffsat snälla felmeddelanden...

<% function funMoveOrCopy(iCopyOrMove, iRelativeFrom, iRelativeTo)
'response.write("<li> iRelativeFrom = " &iRelativeFrom)
	
'1)	-	CREATE FILE SYSTEM OBJECT...
		Set objFso = CreateObject("Scripting.FileSystemObject")
		
'2)	-	VERIFY THAT FROM ADDRESS IS A RELATIVE PATH...
		if instr(iRelativeFrom,"\") = 1 then
			'response.write("<li> iRelativeFrom = " &iRelativeFrom)
		else
			varError = varError &"<p>ERROR! The FROM path must start with \"
		end if
		
'3)	-	VERIFY THAT THE TO ADDRESS IS A RELATIVE PATH...
		if instr(iRelativeTo,"\") = 1 then
		 	iRelativeTo = right(iRelativeTo,len(iRelativeTo)-1)
			'response.write("<li> iRelativeTo = " &iRelativeTo)
		else 
			varError = varError &"<p>ERROR! The TO path must start with \"
		end if 
		
'4)	-	TEST IF IT IS A FOLDER OR A FILE THAT NEEDS TO BE HANDLED...
		if inStr(iRelativeFrom,".") = 0 or inStr(iRelativeFrom,".") = 0 then
			varTargetIs = "Folder"
		else
			varTargetIs = "File"
		end if
		'response.write("<p><li> varTargetIs = " &varTargetIs)
		
'5)	-	VERIFY THAT THE FROM PATH EXISTS...
		if varTargetIs = "Folder" then 
			if not objFso.FolderExists(server.mappath(iRelativeFrom)) Then 
			varError = varError &"<p>ERROR! The FROM path is not found: " &server.mappath(iRelativeFrom) &" &nbsp; Please check that it's correct..."
			end if 
		else 
			if not objFso.FileExists(server.mappath(iRelativeFrom)) Then 
			varError = varError &"<p>The FROM path is not found: " &server.mappath(iRelativeFrom) &" &nbsp; Please check that it's correct..."
			end if 
		end if
		
'6)	-	GET A LIST OFF ALL TARGET FOLDERS...
		myArray = Split(iRelativeTo,"\")
		
'7)	-	LOOP THROUGH ALL FOLDERS AND TEST IF THEY EXIST. IF NOT, CREATE THEM.
		for i = lBound(myArray) to uBound(myArray) 
		
	'7.1)	-	SKIP FILENAMES...
				if inStr(myArray(i),".") <= 0  AND varError = "" then
					
					iRelativeToFolder = iRelativeToFolder &"\" &myArray(i)
					if objFso.FolderExists(server.mappath(iRelativeToFolder)) Then 
						'Folder allready exist. Skip it or do something cool below...
					else 
			'7.2)	-	CREATE FOLDER...
						response.write("<br><li> Create folder " &server.mappath(iRelativeToFolder))
						objFSO.CreateFolder(server.mappath(iRelativeToFolder))
					end if 
				
				end if
 		next
		
'8)	-	MOVE or COPY THE FILE...
		if varTargetIs = "File" and varError = "" then 
			if lCase(iCopyOrMove) = "move" then 	
				'response.write("<p><li>MOVE FILE " &server.mappath(iRelativeFrom) &" , " &server.mappath("\" &iRelativeTo))
				call objFSO.MoveFile(server.mappath(iRelativeFrom),server.mappath("\" &iRelativeTo))
			elseif lCase(iCopyOrMove) = "copy" then
				'response.write("<p><li>COPY FILE " &server.mappath(iRelativeFrom) &" , " &server.mappath("\" &iRelativeTo))
				call objFSO.CopyFile(server.mappath(iRelativeFrom),server.mappath("\" &iRelativeTo))
			else
			varError = varError &"<p>ERROR! Incorrect input. Syntax = &nbsp; call funAddFolderAndSubfolders(""copy"", ""relativeFromPath"", ""relativeToPath"") "
			end if 
		end if
		
'9)	-	MOVE or COPY THE FOLDER...
		if varTargetIs = "Folder" and varError = "" then 
			
	'9.1	-	DETECT IF WE SHOULD COPY THE FOLDER OR ONLY ITS CONTENTS...
				varCutLength = len(iRelativeFrom) - inStrRev(iRelativeFrom,"\")
				varHandleThisItem = right(iRelativeFrom, varCutLength)
				'If no \ exist on the end of the string then we want to copy the folder and not only its contents
				if len(varHandleThisItem) > 0 then 
					iRelativeTo = iRelativeTo &varHandleThisItem
				end if
		
	'9.2)	-	
			'Action...
			if lCase(iCopyOrMove) = "move" then 	
				'response.write("<p><li>MOVE FOLDER " &server.mappath(iRelativeFrom) &" , " &server.mappath("\" &iRelativeTo))
				call objFSO.CopyFolder(server.mappath(iRelativeFrom),server.mappath("\" &iRelativeTo))
				objFSO.DeleteFolder server.mappath(iRelativeFrom), TRUE
			elseif lCase(iCopyOrMove) = "copy" then
				'response.write("<p><li>COPY FOLDER " &server.mappath(iRelativeFrom) &" , " &server.mappath("\" &iRelativeTo))
				call objFSO.CopyFolder(server.mappath(iRelativeFrom),server.mappath("\" &iRelativeTo))
			else
				varError = varError &"<p>ERROR! Incorrect input. Syntax = &nbsp; call funAddFolderAndSubfolders(""copy"", ""relativeFromPath"", ""relativeToPath"") "
			end if 
		end if
		
'10)	-	OUTPUT ANY ERRORS...
		if varError <> "" then %>
			<font face="tahoma" size="1">
			<font color="red"><b><%=varError%></b></font><p>
			<u>Instructions:</u><br>
			Syntax examples: 
			<li> <b>call funMoveOrCopy("[move] [copy]", "[from path]", "[to path]")</b><br>
			<li> <b>call funMoveOrCopy("Copy", "\folderA\folderB", "\folderX\")</b><br>
				This will copy the folder 'folderB' and all subfolders and files to "\folderX\folderB\". Note that the first path has a missing \ at the end.
			<li> <b>call funMoveOrCopy("Copy", "\folderA\folderB\", "\folderX\")</b> <br>
				This will copy all subfolders and files in folderB to "\folderX\".
			<li> <b>call funMoveOrCopy("Move", "\folderA\folderB\mypic.gif", "\folderX\mypic.gif") </b><br>
				This will move the file from A to B.
			<li> <b>call funMoveOrCopy("Move", "\folderA\folderB\mypic.gif", "\folderX\folder1\folder2\folder3\mypic.gif") </b><br>
				This is normally not possible with a single MoveFile syntax but is allowed in this function. If is allowed
				to enter a target path that is not yet created. Any missing folders will be created without any notice.
			<li> <b>call funMoveOrCopy("Move", "\folderA\folderB\mypic.gif", "\folderA\folderB\mypicNEW.gif") </b><br>
				This will rename the mypic.gif file to mypicNEW.gif
			</font>
			<% end if 
end function %>
292 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
147 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)