Avatar billede enric Nybegynder
23. august 2005 - 20:40 Der er 21 kommentarer og
1 løsning

FSO.CreateFolder giver mig problemer

Jeg kæmper med et program som tager livet af mig, problemet nu er  at når Sti = tom umiddelbar sletter NySti så bliver jeg nød til at CreateFolder igen...
Nu,det som jeg aldrig har oplevet før, er at når jeg stepper med F8 så opfører den sig ordentlig men når den bare kører med F5 så overser den  If FSO.FolderExists og det er ikke så godt,er der nogen som kan give mig en forklaring? eller bedre en løsning?

'Word
  Set FSO = CreateObject("Scripting.FileSystemObject")
  Sti = "c:\sala-escars copies de seguritat\Fra sala-escars\Til Benta\Word"
NySti = "c:\Sala-Escars Copies de Seguritat\Fra Sala-Escars\Til Enric\Word"
Command1.Caption = "Espera un moment...O==>S..Winword..."
RetVal = Shell("xcopy " & Chr(34) & Sti & Chr(34) & " " & Chr(34) & NySti & Chr(34) & " /S /Y", 0)
If FSO.FolderExists("c:\Sala-Escars Copies de Seguritat\Fra Sala-Escars\Til Enric\Word\") _
Then GoTo Nest5
FSO.CreateFolder NySti
Nest5:
Set FSO = Nothing
Command1.Caption = "La transferencia esta feta"
Avatar billede softspot Forsker
23. august 2005 - 23:07 #1
Det må være noget med at processen ikke når at starte op inden koden går videre. Såvidt jeg husker, går shell-kommandoen videre uden at vente (da du i princippet starter en ny tråd i.o.m. du starter en ny process - og shell returnerer ligeså snart processen er startet). Når du stepper igennem koden får processen tid til at starte, men det gør den ikke når du bare kører...

Jeg kan ikke huske hvordan det var man kunne vente på en process, men er ret sikker på at det krævede nogle declares af funktioner fra system-dll'er...
Avatar billede enric Nybegynder
23. august 2005 - 23:39 #2
Kunne man evt, sætte nogen delay for at forsinke lidt indtil processen kan følge med
Avatar billede softspot Forsker
23. august 2005 - 23:44 #3
Ja, du kan lave en declare til sleep-funktionen i en anden dll :)

For real! Så tror jeg ikke det ville være den rigtige måde at gøre tingene på, for du vil aldrig være sikker på at du har ventet længe nok (eller brugeren vil blive træt af at vente længe nok til at dit program er interessant nok at bruge :)).
Jeg mener du skal finde en eller anden funktionalitet der hedder noget med WaitForSingleProcess eller noget i den stil... kan ikke huske det - det er 5 år siden jeg sidst har arbejdet seriøst med VB 6 :(
Avatar billede softspot Forsker
23. august 2005 - 23:47 #4
Hmmm... tror den hedder WaitForSingleObject og der findes måske endda noget kode du kan bruge her:

http://www.thescarms.com/VBasic/wait.asp
Avatar billede softspot Forsker
23. august 2005 - 23:49 #5
Om ikke andet kan det måske sparke dig i retning af hvad du skal lede efter...
Avatar billede enric Nybegynder
23. august 2005 - 23:57 #6
virker med
msgbox("Tryk engang")
Avatar billede softspot Forsker
24. august 2005 - 00:00 #7
Ja, men det er vel stadig ikke den optimale løsning... eller hvad?
Avatar billede enric Nybegynder
24. august 2005 - 00:03 #8
nej, nej, lang fra
Avatar billede enric Nybegynder
24. august 2005 - 00:06 #9
den virker ikke, med loop
for i = 1 to 100000
next i
Avatar billede softspot Forsker
24. august 2005 - 00:12 #10
Det lyder som om du har forkastet WaitForSingleObjecct-metoden... er den for kompliceret?
Avatar billede enric Nybegynder
24. august 2005 - 00:19 #11
måske.....
men
For i = 1 To 10000000
Next i
virker....
Avatar billede softspot Forsker
24. august 2005 - 00:23 #12
Ja, indtil det kommer til at køre på en endnu hurtigere maskine, så virker det måske ikke igen. Men det er naturligvis det valg du står overfor :)
Avatar billede enric Nybegynder
24. august 2005 - 00:24 #13
Jeg gir dig 30 point. Fordi du viste mig vejen
Hvordan gir jeg dig point?
Avatar billede softspot Forsker
24. august 2005 - 00:31 #14
I dette tilfælde kan du selv lægge et svar og markere os begge, så deler vi lige over. Der er vist noget med at man kan lave specielle fordelinger af point ved at trykke på et link på pointsiden... men bare læg et svar selv og tildel og begge point, så burde det være nok.
Avatar billede enric Nybegynder
24. august 2005 - 00:42 #15
du får 60 alligevel
Avatar billede softspot Forsker
24. august 2005 - 00:45 #16
Ok, tak for point så.

Jeg håber alligevel at du tager et kig på det link jeg fandt, for jeg tror du mere eller mindre kan copy/paste det ind i din kode og bruge det (du skal jo bare vente på at xcopy bliver færdig, som jeg har forstået dit problem).
Avatar billede enric Nybegynder
24. august 2005 - 01:00 #17
jeg ved ikke rigtig hvordan jeg skal bruge den....
kan du eventuel fortælle mig det?
Avatar billede softspot Forsker
24. august 2005 - 01:09 #18
I den class eller form hvor du udfører kaldet indsætter du denne kode:

Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFF 'Wait forever
Const WAIT_OBJECT_0 = 0 'The state of the specified object is signaled
Const WAIT_TIMEOUT = &H102 'The time-out interval elapsed & the object’s state
'is nonsignaled.


Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
            ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
            ByVal dwMilliseconds As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

og så skulle jeg mene at din kode skal se således ud:

Dim lHnd As Long
Dim lRet As Long

Set FSO = CreateObject("Scripting.FileSystemObject")
Sti = "c:\sala-escars copies de seguritat\Fra sala-escars\Til Benta\Word"
NySti = "c:\Sala-Escars Copies de Seguritat\Fra Sala-Escars\Til Enric\Word"
Command1.Caption = "Espera un moment...O==>S..Winword..."
RetVal = Shell("xcopy " & Chr(34) & Sti & Chr(34) & " " & Chr(34) & NySti & Chr(34) & " /S /Y", 0)

If RetVal <> 0 Then
        'Get a handle to the shelled process.
        lHnd = OpenProcess(SYNCHRONIZE, 0, RetVal)
        'If successful, wait for the application to end and close the handle.
        If lHnd <> 0 Then                                                     
                lRet = WaitForSingleObject(lHnd, INFINITE)
                CloseHandle (lHnd)
        End If
End If

If FSO.FolderExists("c:\Sala-Escars Copies de Seguritat\Fra Sala-Escars\Til Enric\Word\") Then
  GoTo Nest5
End If

FSO.CreateFolder NySti

Nest5:
Set FSO = Nothing
Command1.Caption = "La transferencia esta feta"
Avatar billede enric Nybegynder
24. august 2005 - 01:16 #19
mange tak, så vil jeg prøve imorgen.
Avatar billede softspot Forsker
24. august 2005 - 01:17 #20
Held og lykke med det :)
Avatar billede enric Nybegynder
24. august 2005 - 01:29 #21
jeg kunne ikke vente imorgen og det virkede så mange tak
Enric
Avatar billede softspot Forsker
24. august 2005 - 01:32 #22
Godt så! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester