2010-06-21 5 views
6

Chcę sprawdzić, czy mój ciąg jest prawidłowy ścieżka pliku systemu Windows. Szukałem i wydaje mi się, że nie ma na to niezawodnej metody. Sprawdziłem również bibliotekę plików systemowych doładowania i nie istnieje żadna oczywista funkcja do sprawdzenia, może coś takiego jak is_valid_windows_nameSprawdź nazwę pliku jest poprawna nazwa systemu Windows

+0

Czy chcesz sprawdzić, czy podana ścieżka jest prawidłowa, czy jest poprawna i czy struktura katalogów jest już skonfigurowana dla ścieżki, czy też istnieje już tam plik? –

+0

Dobry smutek. To nie jest duplikat, ponieważ drugi jest oznaczony jako C#, a zaakceptowana odpowiedź daje C# API, podczas gdy jest to oznaczone jako C++. –

+0

Co powiesz na próbę utworzenia pliku o tej nazwie w systemie Windows i sprawdzenie, czy jest to sukces? (być może możesz zmienić ścieżkę tylko na próbę). – cshu

Odpowiedz

1

Można użyć funkcji _splitpath() i przeanalizować dane wyjściowe (na podstawie tego można łatwo stwierdzić, czy ścieżka jest ważna czy nie).

Aby uzyskać dodatkowe informacje, patrz MSDN.

Należy pamiętać, że ta funkcja jest specyficzna dla systemu Windows.

1

Nie sądzę, że istnieje standardowy apik C++ dla tego.

Należy pamiętać, że interfejs API systemu Windows zezwala na więcej nazw plików niż powłoka systemu Windows (nazwy plików, których użytkownik może używać w eksploratorze windws).

Powinieneś rzucić okiem na api powłoki okna.

Inną możliwością jest użycie wersji próbnej i błędu, w ten sposób jesteś naprawdę niezależny od obecnego systemu plików.

Najprostszym sposobem jest zabronić

\/<> | ": *

i powinno być w porządku

+1

i "*" i com, lpt, aux, con –

+0

zaktualizowałem moją odpowiedź :) – codymanix

1

Tak, istnieje funkcja boost, że robi to, co chcesz Spójrz na boost :: plików :: windows_name (...)... Będziesz musiał dołączyć boost/filesystem/path.hpp, a także połączyć się z odpowiednimi bibliotekami libboost_system i libboost_filesystem (zależnie od wersji i architektury), ponieważ ścieżka nie jest biblioteką tylko nagłówkową.

+0

Zwiększenie może być trochę większe, jeśli było to jego jedyne użycie, ale Boost zapewnia wiele funkcji C++ następnej generacji, czyniąc go wartościowym dla ogólnego rozwoju w C++. Kiedy już używasz Boost, jest to świetna opcja. – sage

0

Szkoda nawet najnowsza biblioteka systemów plików C++ 17 nie ma funkcji sprawdzania nazw plików. n użyj specyficznego dla systemu Windows Shell Lightweight Utility functionPathFileExists lub Windows APIGetFileAttributes i sprawdź ostatni kod błędu specjalnie dla ERROR_INVALID_NAME.

Myślę, że jest to rodzaj nadużycia (ponieważ naprawdę powinna to być dedykowana funkcja), ale służy celowi.

+0

Nie tak dobrze, jeśli plik jeszcze nie istnieje. Ponadto zabezpieczenia mogą uniemożliwić dostęp do niego, dopóki nie zostaną podniesione. – CodeLurker

+0

@CodeLurker Dlaczego nie dokładnie?OP chce tylko sprawdzić poprawną nazwę/ścieżkę do pliku Windows –

+0

OP nic już o nim nie mówi. Jeśli nie, te nie pomogą. Możliwe też, że chcemy to sprawdzić, nawet jeśli nie mamy (jeszcze) dostępu do niego. Zwróć uwagę na rozwiązanie, które w końcu rozwiązałem tutaj: https://stackoverflow.com/questions/3038351/check-whether-a-string-is-a-valid-filename-with-qt/45282192#45282192 – CodeLurker