2013-06-01 13 views
10

Muszę sprawić, aby moja aplikacja delphi mogła sprawdzić, czy plik skopiowany przy użyciu Robocopy jest dostępny, gdy jego ścieżka przekracza 255 znaków. Próbowałem zwykłego "If FileExists (MyFile) then ...", ale zawsze zwraca "false", nawet jeśli plik tam jest.Delphi: jak sprawdzić, czy plik istnieje (ścieżka powyżej 255 znaków)

Próbowałem również uzyskać datę pliku, ale dostaję 1899/12/30, które można uznać za pustą datę.

Wyszukiwanie plików również niczego nie zwraca.

Odpowiedz

9

Przedrostek nazwy pliku za pomocą \\?\, aby umożliwić wydłużoną analizę ścieżki. Na przykład możesz napisać

if FileExists('\\?\'+FileName) then 
    .... 

Zauważ, że to będzie działać tylko jeśli dzwonisz wersje Unicode z funkcji Win32 API. Więc jeśli używasz Unicode Delphi, to wykona to zadanie. W przeciwnym razie będziesz musiał przetoczyć własną wersję FileExists, która wywołuje wersje API funkcji Unicode.

Problemy te są omówione na długo w witrynie MSDN: Naming Files, Paths, and Namespaces.

+0

Dzięki za odpowiedź. To rozwiązanie działa świetnie na lokalnych ścieżkach, takich jak e: \ myfilepath, ale utknąłem w ścieżkach UNC, nawet z "If FileExists ('\ \? \ UNC \' + MyFile), a następnie ..." – Fab

+0

Ścieżki UNC działają dobrze tutaj. Jestem przekonany, że moja odpowiedź jest wszystkim, czego potrzebujesz. Coś innego będzie nie tak. Po uzyskaniu przedrostka '\\? \' Unikniesz limitu 260. –

+3

@Fab: Jeśli 'MyFile' zawiera standardową ścieżkę UNC, musisz usunąć przed nią' '\\ '' przedrostek '' \\? \ UNC \ ''. IOW, ''\\ server \ path'' musi stać się'' \\? \ UNC \ server \ path'', a nie '' \\? \ UNC \\\ server \ path'' jak twój kod obecnie wykonuje . –

Powiązane problemy