경로가 UNC 경로인지 확인하는 가장 쉬운 방법은 물론 전체 경로의 첫 번째 문자가 문자 또는 백 슬래시인지 확인하는 것입니다. 이것은 좋은 해결책입니까 아니면 문제가있을 수 있습니까?경로가 UNC 경로 또는 로컬 경로인지 확인하는 올바른 방법은 무엇입니까?
내 특정 문제는 경로에 드라이브 문자가있는 경우 System.IO.DriveInfo 개체를 만들려고한다는 것입니다.
경로가 UNC 경로인지 확인하는 가장 쉬운 방법은 물론 전체 경로의 첫 번째 문자가 문자 또는 백 슬래시인지 확인하는 것입니다. 이것은 좋은 해결책입니까 아니면 문제가있을 수 있습니까?경로가 UNC 경로 또는 로컬 경로인지 확인하는 올바른 방법은 무엇입니까?
내 특정 문제는 경로에 드라이브 문자가있는 경우 System.IO.DriveInfo 개체를 만들려고한다는 것입니다.
첫 번째와 두 번째 위치에 두 개의 백 슬래시가없는 경로는 UNC 경로가 아니기 때문에이 결정을 내리는 데 안전한 방법입니다.
첫 번째 위치 (c :)에있는 드라이브 문자가있는 경로는 루팅 된 로컬 경로입니다.
이 중 하나가없는 경로 (myfolder \ blah)는 상대 로컬 경로입니다. 여기에는 하나의 슬래시 (\ myfolder \ blah) 만있는 경로가 포함됩니다.
가장 정확한 방법은 shlwapi.dll에서
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
[ResourceExposure(ResourceScope.None)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
internal static extern bool PathIsUNC([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);
일부 상호 운용성 코드를 사용하는 것입니다 당신은 다음과 같이 호출합니다 :
/// <summary>
/// Determines if the string is a valid Universal Naming Convention (UNC)
/// for a server and share path.
/// </summary>
/// <param name="path">The path to be tested.</param>
/// <returns><see langword="true"/> if the path is a valid UNC path;
/// otherwise, <see langword="false"/>.</returns>
public static bool IsUncPath(string path)
{
return PathIsUNC(path);
}
@JaredPar 사용 최선의 답이있다 purely managed code.
완벽! 고마워요. – om471987
이 확장 방법
public static bool IsUncDrive(this DriveInfo info) {
Uri uri = null;
if (!Uri.TryCreate(info.Name, UriKind.Absolute, out uri)) {
return false;
}
return uri.IsUnc;
}
DriveInfo 개체는 UNC 경로에 사용할 수 없습니다. 그러나 DirectoryInfo 확장명으로 변경하고 이름 대신 FullName을 사용하면 제대로 작동하는 것 같습니다. –
'Uri.TryCreate' 대신'DirectoryInfo.DriveType == DriveType.Network'를 사용하지 않는 이유가 있습니까? – larsmoa
을보십시오이 내 버전 :
public static bool IsUnc(string path)
{
string root = Path.GetPathRoot(path);
// Check if root starts with "\\", clearly an UNC
if (root.StartsWith(@"\\"))
return true;
// Check if the drive is a network drive
DriveInfo drive = new DriveInfo(root);
if (drive.DriveType == DriveType.Network)
return true;
return false;
}
@JaredPars 버전 이상이 버전의 장점이 어떤 경로뿐만 아니라 DriveInfo
를 지원한다는 것입니다.내가 찾은
한 트릭은 DINFO가의 DirectoryInfo 개체입니다 dInfo.FullName.StartsWith(String.Empty.PadLeft(2, IO.Path.DirectorySeparatorChar))
을 사용하는 것입니다 - 그 검사가 True를 반환하는 경우는, 그렇지 않으면 어쩌면이 대답은 사람에게 도움이 될 수있는 로컬 경로
또는'.StartsWith (새 문자열 (Path.DirectorySeparatorChar, 2))'입니다. – jnm2
UNC 경로입니다 누가 네트워크 경로의 예를 들어, UNC 서버 + 주 + 서브 디렉토리만 확인하고 싶어 저장소와 같은
\\Server1\Share1
\\Server2\Share22\Dir1\Dir2
\\Server3
는 다음과 같은 정규식 사용 :
10
을 대체 서버/디렉토리 이름의 최대 허용 길이 ^\\\\([A-Za-z0-9_\-]{1,32}[/\\]){0,10}[A-Za-z0-9_\-]{1,32}$
32
(2 번) 교체를 (최대 디렉토리 수)[A-Za-z0-9_\-]
(2 회) m 서버/디렉토리 이름에 허용되는 문자를 입력하십시오.성공적으로 테스트했습니다. 즐겨!
경로를 시작하려면 적어도 "\\"를 확인해야합니다 ("\ this \ is \ not \ a \ unc \ path"). 경로에 포함시키는 것이 특히 좋은 것은 아니지만 UNC에 관계없이). –
맞아. 내 대답을 수정했습니다. – TheSmurf
경로 구분 기호가 다른 지역 시스템은 어떻게됩니까? 예 : 일본 시스템의 경우 –