Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1688to1692
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

zu langer Pfad für objFileSearch

zu langer Pfad für objFileSearch
02.05.2019 18:40:06
Christoph
Hallo,
vielleicht kann mir jemand helfen. Mittels objectFileSearch habe ich Dateien gesucht, die ich nun z.T. mittels FileCopy kopieren möchte. Hier ein Ausschnitt um es verständlicher zum machen:
...
Public Type FILEINFO
strFilename As String
strPath As String
lngSize As Long
dmtLastAccess As Date
dmtLastModify As Date
dmtDateCreate As Date
FileCopy .Files(lngIndex).strPath, Temp_Datei_Pfad_und_Name
Das Problem ist nun, dass der Dateiname und Pfad der von mir gefundenen und zu kopierenden Datei zusammen mehr als 256 Zeichen hat. FileCopy meldet nun, dass er die Datei nicht finden kann, klar, weil strPath am Ende einfach einen Teil wegschneidet.
Wer kann mir helfen? Habe schon versucht im Forum etwas zu finden, aber nur das gefunden:
Function Name_pur(strPfad As String) As String
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
Name_pur = objFso.GetBaseName(strPfad)
End Function
(siehe https://www.herber.de/forum/archiv/380to384/383405_Dateinamen_auslesen_aber_ohne.html)
Aber hier bin ich einfach zu doof um das zu verstehen bzw. einzubauen.
Vielleicht habt ihr einen einfacheren Weg oder könnte mir diese Funktion erklären?
1000 DANK, VG Christoph

24
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: zu langer Pfad für objFileSearch
02.05.2019 21:49:20
Nepumuk
Hallo Christoph,
teste mal so:
Option Explicit

Private Declare PtrSafe Function CopyFileA Lib "kernel32.dll" ( _
    ByVal lpExistingFileName As String, _
    ByVal lpNewFileName As String, _
    ByVal bFailIfExists As Long) As Long

Public Sub Test()
    Dim lngReturn As Long
    lngReturn = CopyFileA("C:\Test.xlsx", "D:\ABC.xlsx", 1)
    If lngReturn = 0 Then
        MsgBox "Fehler beim kopieren"
    End If
End Sub

Gruß
Nepumuk
Anzeige
AW: zu langer Pfad für objFileSearch
03.05.2019 09:38:23
Christoph
Hallo Nepumuk, vielen Dank, aber ich verstehe nicht ganz... Habe es jetzt so eingebaut:
lngReturn = CopyFileA(.Files(lngIndex).strPath, Temp_Datei_Pfad_und_Name, 1)
Aber die Fehlermeldung erscheint trotzdem. Denn

.Files(..).strPath
kann dadurch doch trotzdem nicht mit dem langen Pfad umgehen. Und die Datei, die ich kopieren will, habe ich ja nur durch .Files(lngIndex). gefunden/erreicht.
Vermutlich hast Du es auch anders gemeint und ich stelle mich doof an... Bräuchte also nochmals Deine Hilfe... 1000 DANK
Anzeige
AW: zu langer Pfad für objFileSearch
03.05.2019 10:17:22
Nepumuk
Hallo Christoph,
bekommst du eine Fehlermeldung? Wenn ja, welche (Nummer und Text)?
welches ist der "lange" Pfad?
Gruß
Nepumuk
AW: zu langer Pfad für objFileSearch
03.05.2019 10:58:42
Christoph
Hallo,
Beim Objekt lngIndex = 596 ist len(.Files(lngIndex).strgPath) = 286
strPath speichert aber nur die ersten 255 Zeichen. Also fehlt vom Pfad der hintere Teil und Dein CODE springt in die Wenn-Schleife, da lngReturn = 0 ist. Die MsgBox öffnet sich...
Eigentlich klar, weil er das Objekt ja gar nicht findet...
Ich müsste das Objekt .Files(lngIndex) irgendwie anders übergeben können, da strPath nur 255 Zeichen schafft...
Gruß Christoph
Anzeige
AW: zu langer Pfad für objFileSearch
03.05.2019 11:10:01
Nepumuk
Hallo Christoph,
dann teste mal so:
Option Explicit

Private Declare PtrSafe Function CopyFileA Lib "kernel32.dll" ( _
    ByVal lpExistingFileName As String, _
    ByVal lpNewFileName As String, _
    ByVal bFailIfExists As Long) As Long
Private Declare PtrSafe Function GetShortPathNameA Lib "kernel32.dll" ( _
    ByVal lpszLongPath As String, _
    ByVal lpszShortPath As String, _
    ByVal cchBuffer As Long) As Long

Private Const MAX_PATH As Long = 260&

Public Sub Test()
    
    Dim lngReturn As Long
    Dim strShortPath As String
    
    strShortPath = Space$(MAX_PATH)
    lngReturn = GetShortPathNameA(.Files(lngIndex).strPath, strShortPath, MAX_PATH)
    If lngReturn = 0 Then
        MsgBox "Fehler beim ermitteln des DOS-Pfades"
        Exit Sub
    Else
        strShortPath = Left$(strShortPath, lngReturn)
    End If
    
    lngReturn = CopyFileA(strShortPath, Temp_Datei_Pfad_und_Name, 1)
    If lngReturn = 0 Then
        MsgBox "Fehler beim Kopieren"
    End If
End Sub

Gruß
Nepumuk
Anzeige
AW: zu langer Pfad für objFileSearch
03.05.2019 14:42:49
Christoph
Hallo Nepumuk,
lngReturn = 0 --> "Fehler beim ermitteln des DOS-Pfades". Wie vorher.
Auch wenn ich Deinen CODE nicht wirklich verstehe erscheint es mir aber logisch, dass es weiterhin nicht klappt. Denn das Problem liegt doch im .Files(lngIndex).strgPath. Dieser String ist doch auf 255 begenz und wird somit abgeschnitten.
Hier nochmals der Code für diese FILEINFO vom strPath:
Public Type FILEINFO
strFilename As String
strPath As String
lngSize As Long
dmtLastAccess As Date
dmtLastModify As Date
dmtDateCreate As Date
Kann man das Objekt .Files(lngIndex) nicht ohne Abfragen des Pfades woanders hinkopieren oder dublizieren? Der PFad interessiert mich ja eigentlich gar nicht. Ich brauche nur eine Kopie der Date an einem anderen Ort...
VG und Danke für Deine Hilfe.
Anzeige
AW: zu langer Pfad für objFileSearch
03.05.2019 14:55:44
Christoph
Also mal in Laiensprache:

Neues_Temp_Objekt = .Files(lngIndex)
Save Neues_Temp_Objekt unter "d:/temp/temp-txt"

oder noch besser für mich:

Neues_Temp_Objekt = .Files(lngIndex)
Workbooks.OpenText Neues_Temp_Objekt ' Also öffne diese Datei
Denn letzlich will ich diese doofe Txt Datei ja nur importieren, wo sie liegt ist mir ja schnuppe. :-)
Dies tue ich bisher mit
    Workbooks.OpenText Filename:=File_Name _
, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:= _
False, Comma:=True, Space:=False, Other:=True, OtherChar:="@", _
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array  _
_
(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), _
_
Array(13, 1), Array(14, 1), Array(15, 1)), TrailingMinusNumbers:=True
und hier wille er halt einen PFAD :-(
Anzeige
AW: zu langer Pfad für objFileSearch
03.05.2019 15:22:06
Nepumuk
Hallo Christoph,
das Problem mit dem langen Pfad hat Excel selbst, das kann mit Pfaden die länger sind als 216 Zeichen nicht umgehen. Da musst du dir überlegen ob du die Datei nicht in einem Ordner hältst der nicht so tief liegt.
Gruß
Nepumuk
AW: zu langer Pfad für objFileSearch
03.05.2019 16:17:08
Christoph
Hallo Nepumuk,
an dem Ort und den langen Pfadnamen kann ich aber leider nichts machen.
Meine Idee war eben, diese Datei einfach zu einem Ort mit kurzem Pfad zu kopieren (temporär) und erst dann mit Excel OpenText zu öffnen.
Ich bräuchte daher eine Lösung, in VBA eine Datei zu kopieren, deren Pfad größer 255 Zeichen ist.
Also Kopiere Datei von langem Pfad zu d:\temp\ und öffne es dann erst mit Excel.
Ihr seid hier im Forum sooo gut... Bestimmt hat jemand noch eine Idee, oder?
Nochmals 1000 DANK
Anzeige
AW: zu langer Pfad für objFileSearch
03.05.2019 16:41:39
Nepumuk
Hallo Christoph,
ich habe es jetzt mal mit einem Pfad mit 256 Zeichen (mehr lässt mein Windows nicht zu) getestet. Die Funktion CopyFileA hat kein Problem damit. Also daran kann es nicht liegen. Lass dir mal den Pfad im Direktfenster ausgeben (Debug.Print) stimmt denn das was gefunden wurde?
Gruß
Nepumuk
AW: zu langer Pfad für objFileSearch
03.05.2019 17:19:46
Christoph
Spannend... Du hast recht:
debug.print .Files(596).strPath

ergibt im Direktfenster: "c:\Users\ch ... 456.hp", also wirklich den vollständigen Pfad, hier 286 Zeichen.
Ich übergebe dies aber ja an eine Sub:

Import_File (.Files(lngIndex).strPath)
Sub Import_File(File_Name As String)
Dieser File_Name ist aber dann abgeschnitten auf 255 Zeichen, so dass er mit
Workbooks.OpenText Filename:=File_Name ...

nicht weiter kommt
Blöde Frage, aber kann ein STRING nur 256 Zeichen? Das wusste ich nicht.
Kann ich denn statt String einen anderen Variablentyp wählen.
SORRY, aber wenn das die Lösung wäre... ich werd verrückt... :-)
Anzeige
AW: zu langer Pfad für objFileSearch
03.05.2019 18:11:18
Christoph
Schade... laut https://www.herber.de/forum/archiv/540to544/543495_CopyFile.html sollte das eigentlich gehen. Dann hätte ich mein Problem vielleicht gelöst. Aber das Kürzen mittels * mag er nicht :-(.
   Sub test()
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile "d:\tmp\tmp\Origina*.hp", "d:\tmp\Kopie.hp", True
End Sub

AW: zu langer Pfad für objFileSearch
03.05.2019 18:13:24
Planlos
Statt CopyFileA, welches hinsichtlich des Pathes auf Max_path (260 Zeichen) bergrenzt ist, solltest du dann eher CopyFileW verwenden um die Datei aus dem Path mit dem langen Namen in ein kürzeres Verteichnis zu kopieren um sie dann danach in Execl zu impotieren.
Luftcode (in Anlehnung an dem Vorschlag von Nepumuk)
Private Declare PtrSafe Function CopyFileW Lib "kernel32.dll" _
( _
ByVal lpExistingFileName As LongPtr, _
ByVal lpNewFileName As LongPtr, _
ByVal bFailIfExists As Long _
) As Long
der Aufruf wäre dann
lngReturn = CopyFileW(strptr(.Files(lngIndex).strPath), strptr(Temp_Datei_Pfad_und_Name), 1)
Anzeige
AW: zu langer Pfad für objFileSearch
03.05.2019 19:30:19
Christoph
Hallo, auch das klappt nicht. Hier im Test habe ich Deinen CODE ausprobiert... Aber lngReturn = 0 und keine Datei wird kopiert.
Private Declare PtrSafe Function CopyFileW Lib "kernel32.dll" ( _
ByVal lpExistingFileName As LongPtr, _
ByVal lpNewFileName As LongPtr, _
ByVal bFailIfExists As Long) As Long
Sub test()
lngReturn = CopyFileW(StrPtr("C:\User ...281 ZEICHEN... .txt"), , StrPtr("d:\tmp\tmp2.txt"), _
1)
If lngReturn = 0 Then
MsgBox "Fehler beim kopieren"
End If
End Sub
Verflixt, warum mag das nicht klappen? Könnten evtl. , oder Leerzeichen im Pfad stören?
VG und DANKE
AW: zu langer Pfad für objFileSearch
03.05.2019 19:35:23
Christoph
P.s. Dein CODE mit einem Pfad_Namen mit nur 140 Zeichen...
Klappt. Egal ob mit oder ohne Komma. Also liegt es doch immer noch an der Länge, oder?
AW: zu langer Pfad für objFileSearch
03.05.2019 20:02:09
Planlos
versuch:

Private Declare PtrSafe Function CopyFileW Lib "kernel32.dll" ( _
ByVal lpExistingFileName As LongPtr, _
ByVal lpNewFileName As LongPtr, _
ByVal bFailIfExists As Long) As Long
Sub test()
lngReturn = CopyFileW(StrPtr("\\?\C:\User ...281 ZEICHEN... .txt"), StrPtr("d:\tmp\tmp2.txt" _
), _
1)
If lngReturn = 0 Then
MsgBox "Fehler beim kopieren"
End If
End Sub

AW: zu langer Pfad für objFileSearch
04.05.2019 15:32:52
Christoph
Hallo Planlos,
das hat (im Test) geklappt. Verrätst Du mir was

\\?\
bedeutet? Warum geht es jetzt?
Schonmal vielen Dank...
Baue es jetzt in meinen etwas komplizierten CODE ein, aber wenn es hier klappt, warum nicht auch dort.
1 Frage noch:
Und wenn mir jetzt noch jemand sagen kann, wie ich einen String mit mehr als 256 Zeichen an eine Funktion/Sub übergeben kann, dann wäre ich überglücklich!!!
Viele Grüße
AW: zu langer Pfad für objFileSearch
04.05.2019 16:04:12
Christoph
Auch in meinem CODE hat es geklappt... Musste es noch verketten:
 "\\?\" & ..Files.StrPath 

aber das hat gut geklappt.
1000 DANK VG und nochmals Danke für Eure HILFE !!!
AW: zu langer Pfad für objFileSearch
03.05.2019 22:00:41
Nepumuk
Hallo Christoph,
mit dem Code in der Mustermappe kann ich problemlos eine Datei mit einem Pfad von 460 Zeichen kopieren:
https://www.herber.de/bbs/user/129561.xlsm
Gruß
Nepumuk
AW: zu langer Pfad für objFileSearch
04.05.2019 15:35:46
Christoph
Hallo Nebumuk, die kleine Änderung von Planlos hat geklappt. Deinen CODE habe ich mir zwar angesehen, verstehe aber vieles da nicht und möchte ungerne für mich nicht verständlichen CODE einbauen.
Ich hoffe Du verstehst das? Außerdem hat Planlos CODE weniger Zeilen :-).
Eine FRage, die ich auch Planlos noch gefragt habe...
Wie kann ich einen String mit mehr als 256 Zeichen an eine Funktion/Sub übergeben?
Gibt es eine Variable etwa wie String_Extra-Lang? :-)
1000 Dank für Eure Hilfe.
VG CHristoph
AW: zu langer Pfad für objFileSearch
04.05.2019 16:54:10
Nepumuk
Hallo Christoph,
es gibt bei Strings eine Grenze bei 2 Milliarden Zeichen. Auch als Parameter einer Prozedur gibt es keine andere Grenze. Teste mal:
Option Explicit

Public Sub Test1()
    Dim x As String
    x = String$(65536, "*")
    Call Test2(x)
End Sub

Private Sub Test2(y As String)
    MsgBox Len(y)
End Sub

Gruß
Nepumuk
AW: zu langer Pfad für objFileSearch
03.05.2019 16:23:55
mmat
Hallo Christoph
vielleicht hilft dir der gute alte "subst"-Befehl. (ich hoffe den gibt's noch bei Windows 10 ...)
Damit könntest du einen langen Teil des gesamten Pfades einfach einem Laufwerksbuchstaben zuweisen.
vg, MM
AW: zu langer Pfad für objFileSearch
03.05.2019 17:51:08
Christoph
Hallo mmat,
tut mir leid. Ich verstehe deine Idee leider nicht.
Mein Problem ist eigentlich, dass OpentText den langen Pfad nicht schluckt. Daher war meine Idee die Datei an einen kurzen Pfad temporär abzulegen und dann OpenText zu nutzen. Aber auch das Kopieren hat mit dem langen Pfad nicht geklappt...
Nepumuk habe ich meine neuste Idee geschickt...
Danke und VG
AW: zu langer Pfad für objFileSearch
06.05.2019 17:06:37
mmat
Hallo Christoph,
subst ist ein Kommandozeilenbefehl, den es schon zu MS-DOS Zeiten gab. unter Windows 7 gibt's ihn noch. Darüber finden sich massenhaft Hinweise im Web. Suche "subst msdos".
Der Befehl sorgt im Ergebnis dafür, dass der Pfad zu deinen Dateien sehr kurz wird (Ohne das an der Dateiablage irgendwas verändert wird). Ein zu langer Pfad war doch dein Problem, oder?
ffpx, MM

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige