If Exist mit API ?

Moin,
ich kopiere Datein aus einem Ordner in einen Anderen.
Der Scanvorgang, also das Ziellaufwerk wird mit Unterordner gescant doch werden leider beim Kopieren nicht die nötigen Ordner erstellt.
Ist das hier der richtige Mkdir befehl für API ? oder ist das FSO ?

If PathFileExists(Zieln1) = 0 Then
MkDir Zieln1
End If

mfg jonny

Hallo,

Ist das hier der richtige Mkdir befehl für API ? oder ist das
FSO ?

If PathFileExists(Zieln1) = 0 Then
MkDir Zieln1
End If

Bei mir sieht das so aus:

Option Explicit

Private Declare Function PathFileExists Lib \_
"shlwapi.dll" Alias "PathFileExistsA" \_
(ByVal pszPath As String) As Long

Private Sub Command1\_Click()
 If PathFileExists("C:\Test") = False Then
 MkDir "C:\Test\"
 End If
End Sub

kein FSO, das ist ein API-Aufruf. (schön schnell. :smile:)

Gruß, Rainer

Komplizierte entstörung:stuck_out_tongue:
Nabend,
Mit Mkdir funktioniert es bis zu einem Punkt Wo ein Unterordner erstellt werden soll in einem Ordner der noch nicht existiert :confused:
Warum das Passiert kann ich noch nicht sagen hätte aber 1-3 Möglichkeiten.
Ich poste mal die wichtigsten punkte:
Path1 = „D:\Doku“
Ziel1 = „D:\Dokuneu“

Field(UsedField) = Root & File + Str$(SysTime.wMonth) _

  • „/“ + LTrim(Str$(SysTime.wDay)) + „/“ + LTrim(Str$(SysTime.wYear))
    Source = Root & File 'QuellPfad OhneDatum
    Zielx = Replace(Source, Path1, „“) '- Path
    Desti = Ziel1 & Zielx '+Ziel
    Dircheckroot = Replace(Root, Path1, „“) 'Ordner ohne FIle
    Dircheck = Ziel1 & Dircheckroot 'neuerOrdnerpfad

List2.AddItem Dircheck 'controlle …
List2.AddItem Source 'controlle …

If PathFileExists(Dircheck) = False Then
MkDir Dircheck
End If

APICopy 'COpy Source nach Desti

Ich habe noch ein „Filter“ im Code komisch nur das es auch mit ihm bis zum besagten ordner funktioniert:
If (File „.“) And (File „…“) Then

GetAllFiles = GetAllFiles + GetAllFiles(Root & File, _
Such, Field, UsedField)
Else

If (UsedField = UBound(Field)) = 0 Then
ReDim Preserve Field(0 To UBound(Field) + 100)
End If
End If
End If

If ((Such Like Right$(UCase$(File), Len(Such))) Or Such = „*“) And (File „.“) And (File „…“) Then

soll ich lieber mal den ganzen code posten ?

mfg joe

Moin Joe,

Mit Mkdir funktioniert es bis zu einem Punkt Wo ein
Unterordner erstellt werden soll in einem Ordner der noch
nicht existiert :confused:

hmmm, ich bin mir nicht ganz sicher, aber ich fürchte, das geht auch nicht anders. Ich kann mich nicht erinnern, daß ich schon mal zwei Ebenen von Verzeichnissen auf einmal angelegt hätte.

Warum das Passiert kann ich noch nicht sagen hätte aber 1-3
Möglichkeiten.
Ich poste mal die wichtigsten punkte:
Path1 = „D:\Doku“
Ziel1 = „D:\Dokuneu“

Field(UsedField) = Root & File +
Str$(SysTime.wMonth) _

  • „/“ + LTrim(Str$(SysTime.wDay)) + „/“ +
    LTrim(Str$(SysTime.wYear))
    Source = Root & File 'QuellPfad OhneDatum
    Zielx = Replace(Source, Path1, „“) '- Path
    Desti = Ziel1 & Zielx '+Ziel
    Dircheckroot = Replace(Root, Path1, „“) 'Ordner
    ohne FIle
    Dircheck = Ziel1 & Dircheckroot
    'neuerOrdnerpfad

List2.AddItem Dircheck 'controlle …
List2.AddItem Source 'controlle …

If PathFileExists(Dircheck) = False Then
MkDir Dircheck
End If

APICopy 'COpy Source nach Desti

Ich habe noch ein „Filter“ im Code komisch nur das es auch mit
ihm bis zum besagten ordner funktioniert:
If (File „.“) And (File „…“) Then

GetAllFiles = GetAllFiles +
GetAllFiles(Root & File, _
Such, Field, UsedField)
Else

If (UsedField = UBound(Field)) = 0 Then
ReDim Preserve Field(0 To
UBound(Field) + 100)
End If
End If
End If

If ((Such Like Right$(UCase$(File), Len(Such))) Or
Such = „*“) And (File „.“) And (File „…“)
Then

soll ich lieber mal den ganzen code posten ?

nein, lieber nicht. :smile: Der Code wird allmählich so lang und unübersichtlich, daß ich nur noch die Hälfte verstehe und deshalb Fehler nicht sehe. Da hilft nur der Debugger.

Gruß, Rainer

hmpf. Nach dem ersten durchlauf hat er 1,10 GB von 1,12 Kopiert … beim 2ten 1,12 von .1,12 aber es fehlen trotzdem 4 ordner …

was ich mir noch vorstellen könnte wäre:
Wenn beim MKDir ein Fehler macht vom Pfad den letzten Ordner abschneiden … ich konnte doch beim Replace eine Variabel sagen das sie von REchts „Abschneiden“ soll oder ? beim ersten \ und wenn dor auch ein fehler auftaucht beim 2ten … anderes wüsste ich keine lösung…

mfg joe

ich möchte schnell die fehlenden Buchstaben nachreichen :stuck_out_tongue:
Guten Morgen

hmpf. Nach dem ersten durchlauf hat er 1,10 GB von 1,12
Kopiert … beim 2ten 1,12 von .1,12 aber es fehlen trotzdem 4
ordner …

was ich mir noch vorstellen könnte wäre:
Wenn MKDir ein Fehler macht soll vom Pfad der letzten Ordner
abgeschnitten werden … ich konnte doch beim Replace der eine Variable
sagen das sie von REchts „Abschneiden“ soll oder ? beim ersten
\ und wenn dor auch ein fehler auftaucht beim 2ten … anderes
wüsste ich keine lösung…

mfg joe

hi Joe,

was ich mir noch vorstellen könnte wäre:
Wenn beim MKDir ein Fehler macht vom Pfad den letzten Ordner
abschneiden … ich konnte doch beim Replace eine Variabel
sagen das sie von REchts „Abschneiden“ soll oder?

Oder. :smile: Was Du vor hast sieht so aus:

root = Left(Verzeichnis, InStrRev(Verzeichnis, „“) - 1)

Gruß, Rainer

Nabend,
frage:

lngHandle = CreateFile(Root & File, GENERIC_WRITE, FILE_SHARE_READ Or _
FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)

GetFileTime lngHandle, Ft1, Ft1, Ft2

FileTimeToLocalFileTime Ft2, Ft1
FileTimeToSystemTime Ft1, SysTime

was ist was ?
lngHandle ist ne VAriable Long. Root & File der pfad + datei.
Warum CreateFile und Generic_Write…
GEtFileTime ist soweit klar.
Warum ich Ft1 und Ft2 noch in LocalFileTIme& SystemTime verwandel hat wohl den Grund das das datum wohl noch eine M$ zahlenkombi ist.

ich müsste nun von dem Ziellauferk / datei das datum erfragen tue mich damit aber noch etwas schwehr.

Also ich habe die Variable ZielT As Long und möchte dort änderungs datum einer datei var datez as String in erfahrung bringen.

bis gleich mfg joe

Hi Joe,

Du machst Dir das einfach immer zu schwer.
Ich habe Dir das mal in ein Modul gepackt:

Option Explicit

Private Type FILETIME
 dwLowDateTime As Long
 dwHighDateTime As Long
End Type
Private Type SHFILEOPSTRUCT
 hWnd As Long
 wFunc As Long
 pFrom As String
 pTo As String
 fFlags As Integer
 fAborted As Boolean
 hNameMaps As Long
 sProgress As String
End Type
Private Type SYSTEMTIME
 wYear As Integer
 wMonth As Integer
 wDayOfWeek As Integer
 wDay As Integer
 wHour As Integer
 wMinute As Integer
 wSecond As Integer
 wMilliseconds As Integer
End Type
Private Const GENERIC\_WRITE = &H40000000
Private Const OPEN\_EXISTING = 3
Private Const FILE\_SHARE\_READ = &H1
Private Const FILE\_SHARE\_WRITE = &H2
Private Const FO\_DELETE = &H3
Private Declare Function GetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
Public Function GFTM(ByVal Datei As String) As String
 Dim lngHandle As Long, SHDirOp As SHFILEOPSTRUCT, lngLong As Long
 Dim Ft1 As FILETIME, Ft2 As FILETIME, SysTime As SYSTEMTIME
 lngHandle = CreateFile(Datei, GENERIC\_WRITE, FILE\_SHARE\_READ Or FILE\_SHARE\_WRITE, ByVal 0&, OPEN\_EXISTING, 0, 0)
 GetFileTime lngHandle, Ft1, Ft1, Ft2
 FileTimeToLocalFileTime Ft2, Ft1
 FileTimeToSystemTime Ft1, SysTime
 GFTM = LTrim(Str$(SysTime.wDay)) + "." + LTrim(Str$(SysTime.wMonth)) + "." + LTrim(Str$(SysTime.wYear))
 CloseHandle lngHandle
End Function

Das kommt in ein Modul, kannst Du immer wieder verwenden.
Im Programm schreibst Du z.B.:

Option Explicit

Private Sub Command1\_Click()
 Command1.Caption = GFTM("C:\Test.txt")
End Sub

Du rufst einfach die Funktion auf, übergibst den Dateinamen samt Pfad und bekommst das Datum zurück. Was im Modul steht muß Dich dann nicht mehr kümmern, den Code brauchst Du nicht mehr anzusehen, nur noch die Funktion aufrufen. Wenn Dir der Name nicht gefällt, schreib einen anderen hin, mir ist gerade nichts eingefallen. :smile:

Gruß, Rainer

Danke Rainer!!
Moin,
Danke Danke alles Funktioniert bestens !!!
habe mir erlaubt noch std & minute anzufügen … war erst wegen der fehlenden führenden 0 bei den minuten stutzig aber merke gerade das es ganz egal ist :stuck_out_tongue:
Danke Rainer. bis später

GFTM = LTrim(Str$(SysTime.wDay)) + „.“ + LTrim(Str$(SysTime.wMonth)) + „.“ + LTrim(Str$(SysTime.wYear)) + „.“ + LTrim(Str$(SysTime.wHour)) + „:“ + LTrim(Str$(SysTime.wMinute))

Hi Joe,

*gg* ich hatte die Änderung gerade fertig, samt Millisekunden. :smile:

Wenn Dich fehlende Nullen stören, die füge ich immer etwas kompliziert ein …

Right („00“ + Trim(Str(Zahl)),2)

… das ist eigentlich zu lang, daraus sollte man wohl auch eine Funktion machen.

Gruß, Rainer