Проверьте правильность пути
Мне просто интересно: я ищу способ проверить, действительно ли данный путь.
(Примечание: я не хочу проверять, существует ли файл! Я хочу только проверить правильность пути - так что если файл может существовать в этом месте).
Проблема в том, что я ничего не могу найти в API.Net.
Из-за большого количества форматов и местоположений, поддерживаемых Windows, я предпочел бы использовать что-то MS-native.
Так как функция должна быть в состоянии проверить:
- Относительные пути (./)
- Абсолютные пути (c:\tmp)
- UNC-Pathes (\ some-pc\c $)
- Ограничения NTFS, такие как полный путь 1024 символов - если я не ошибаюсь, превышение пути сделает файл недоступным для многих внутренние функции Windows. Переименование его с помощью Explorer по-прежнему работает
- Тома GUID-пути: "\?\Volume {GUID}\somefile.foo
Есть ли у кого-нибудь такая функция?
Ответы
Ответ 1
Попробуйте Uri.IsWellFormedUriString()
:
-
Строка неправильно экранирована.
http://www.example.com/path???/file name
-
Строка представляет собой абсолютный Uri, который представляет собой неявный файл Uri.
c:\\directory\filename
-
Строка - это абсолютный URI, в котором отсутствует косая черта перед контуром.
file://c:/directory/filename
-
Строка содержит необменимые обратные косые черты, даже если они рассматриваются как косые черты.
http:\\host/path/file
-
Строка представляет собой иерархический абсолютный Uri и не содержит "://".
www.example.com/path/file
-
Парсер для Uri.Scheme указывает, что исходная строка не была правильно сформирована.
The example depends on the scheme of the URI.
Ответ 2
Или используйте FileInfo, как предложено в В С# проверьте, что имя файла возможно допустимо (не существует).
Ответ 3
private bool IsValidPath(string path)
{
Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$");
if (!driveCheck.IsMatch(path.Substring(0, 3))) return false;
string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidPathChars());
strTheseAreInvalidFileNameChars += @":/?*" + "\"";
Regex containsABadCharacter = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]");
if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3)))
return false;
DirectoryInfo dir = new DirectoryInfo(Path.GetFullPath(path));
if (!dir.Exists)
dir.Create();
return true;
}
Ответ 4
Ближайшим я пришел, пытаясь создать его и посмотреть, удастся ли ему выполнить.
Ответ 5
Вы можете попробовать этот код:
try
{
Path.GetDirectoryName(myPath);
}
catch
{
// Path is not valid
}
Я не уверен, что он охватывает все случаи...
Ответ 6
Directory.Exists?
Ответ 7
Получить недопустимые символы из System.IO.Path.GetInvalidPathChars();
и проверить, содержит ли ваша строка (путь к каталогу) или нет.
Ответ 8
Попробуйте этот метод
/// <summary>
/// Validate the Path. If path is relative append the path to the project directory by default.
/// </summary>
/// <param name="path">Path to validate</param>
/// <param name="RelativePath">Relative path</param>
/// <param name="Extension">If want to check for File Path</param>
/// <returns></returns>
private static bool ValidateDllPath(ref string path, string RelativePath = "", string Extension = "")
{
// Check if it contains any Invalid Characters.
if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1)
{
try
{
// If path is relative take %IGXLROOT% as the base directory
if (!Path.IsPathRooted(path))
{
if (string.IsNullOrEmpty(RelativePath))
{
// Exceptions handled by Path.GetFullPath
// ArgumentException path is a zero-length string, contains only white space, or contains one or more of the invalid characters defined in GetInvalidPathChars. -or- The system could not retrieve the absolute path.
//
// SecurityException The caller does not have the required permissions.
//
// ArgumentNullException path is null.
//
// NotSupportedException path contains a colon (":") that is not part of a volume identifier (for example, "c:\").
// PathTooLongException The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 characters.
// RelativePath is not passed so we would take the project path
path = Path.GetFullPath(RelativePath);
}
else
{
// Make sure the path is relative to the RelativePath and not our project directory
path = Path.Combine(RelativePath, path);
}
}
// Exceptions from FileInfo Constructor:
// System.ArgumentNullException:
// fileName is null.
//
// System.Security.SecurityException:
// The caller does not have the required permission.
//
// System.ArgumentException:
// The file name is empty, contains only white spaces, or contains invalid characters.
//
// System.IO.PathTooLongException:
// The specified path, file name, or both exceed the system-defined maximum
// length. For example, on Windows-based platforms, paths must be less than
// 248 characters, and file names must be less than 260 characters.
//
// System.NotSupportedException:
// fileName contains a colon (:) in the middle of the string.
FileInfo fileInfo = new FileInfo(path);
// Exceptions using FileInfo.Length:
// System.IO.IOException:
// System.IO.FileSystemInfo.Refresh() cannot update the state of the file or
// directory.
//
// System.IO.FileNotFoundException:
// The file does not exist.-or- The Length property is called for a directory.
bool throwEx = fileInfo.Length == -1;
// Exceptions using FileInfo.IsReadOnly:
// System.UnauthorizedAccessException:
// Access to fileName is denied.
// The file described by the current System.IO.FileInfo object is read-only.-or-
// This operation is not supported on the current platform.-or- The caller does
// not have the required permission.
throwEx = fileInfo.IsReadOnly;
if (!string.IsNullOrEmpty(Extension))
{
// Validate the Extension of the file.
if (Path.GetExtension(path).Equals(Extension, StringComparison.InvariantCultureIgnoreCase))
{
// Trim the Library Path
path = path.Trim();
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
catch (ArgumentNullException)
{
// System.ArgumentNullException:
// fileName is null.
}
catch (System.Security.SecurityException)
{
// System.Security.SecurityException:
// The caller does not have the required permission.
}
catch (ArgumentException)
{
// System.ArgumentException:
// The file name is empty, contains only white spaces, or contains invalid characters.
}
catch (UnauthorizedAccessException)
{
// System.UnauthorizedAccessException:
// Access to fileName is denied.
}
catch (PathTooLongException)
{
// System.IO.PathTooLongException:
// The specified path, file name, or both exceed the system-defined maximum
// length. For example, on Windows-based platforms, paths must be less than
// 248 characters, and file names must be less than 260 characters.
}
catch (NotSupportedException)
{
// System.NotSupportedException:
// fileName contains a colon (:) in the middle of the string.
}
catch (FileNotFoundException)
{
// System.FileNotFoundException
// The exception that is thrown when an attempt to access a file that does not
// exist on disk fails.
}
catch (IOException)
{
// System.IO.IOException:
// An I/O error occurred while opening the file.
}
catch (Exception)
{
// Unknown Exception. Might be due to wrong case or nulll checks.
}
}
else
{
// Path contains invalid characters
}
return false;
}
Ответ 9
private bool IsValidPath(string path)
{
Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$");
if (string.IsNullOrWhiteSpace(path) || path.Length < 3)
{
return false;
}
if (!driveCheck.IsMatch(path.Substring(0, 3)))
{
return false;
}
var x1 = (path.Substring(3, path.Length - 3));
string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidPathChars());
strTheseAreInvalidFileNameChars += @":?*";
Regex containsABadCharacter = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]");
if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3)))
{
return false;
}
var driveLetterWithColonAndSlash = Path.GetPathRoot(path);
if (!DriveInfo.GetDrives().Any(x => x.Name == driveLetterWithColonAndSlash))
{
return false;
}
return true;
}
Ответ 10
Вы можете попробовать использовать Path.IsPathRooted() в сочетании с Path.GetInvalidFileNameChars(), чтобы убедиться, что путь на полпути в порядке.