2012-08-30 1 views
2

나는이 다음과 같은 패턴을 따르는 파일 경로 :이 파일 경로의 마지막 부분은 어떻게 구합니까?

일부 \ 파일 \ 경로 \ 자료 \ yyyy를 \ MM \ DD \ HH \ mm \ Random8.3

I 2012 년 이후 모든 것을 추출 할

그러나 문제는 오른쪽이 표준이지만 기본 디렉토리는 각 레코드마다 다를 수 있다는 것입니다.

  1. C : \ 온도 \ X \ 2012 \ 08 \ 27 \ 18 \ 35 \ wy32dm1q.qyt
    결과 : 2012\08\27\18\35\wy32dm1q.qyt

  2. D : \ 온도

    는 다음 두 가지 예 \ X \ Y \ 2012 \ 08 \ 27 \ 18 \ 36 개 \ tx84uwvr.puq
    반환 값 : 지금 2012\08\27\18\36\tx84uwvr.puq

2012 년 이전에 문자열의 인덱스를 얻으려면 LastIndexOf(Path.DirectorySeparatorChar) N 번을 가져온 다음 해당 인덱스에서 하위 문자열을 가져옵니다. 그러나 나는 아마도 더 좋은 방법이 있다고 생각한다.

+0

나는 나의 대답을 철회하고있다, 나는 당신의 질문에서 "그리고 그 이상"을 주목했다. 정규식 "\\\ d {4} \\"와 일치하는 함수를 작성하여 다음 10 문자를 DateTime으로 변환 한 후 01-01-2012와 비교합니다. 불행히도 정규 표현식에 대한 전문 지식이 부족하고 권위있는 답변을 제공 할 수 없습니다. –

+0

이 기본 디렉토리가 앱의 변수로 있습니까? –

+0

정규식을 사용할 수도 있지만 그 이유는 무엇입니까? LastIndexOf를 for 루프에서 두드려서 아마도 자체 메서드로 래핑하면 충분합니다. –

답변

3

될 것이다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(ExtractPath(@"C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt")); 
     Console.WriteLine(ExtractPath(@"D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq")); 
    } 

    static string ExtractPath(string fullPath) 
    { 
     string regexconvention = String.Format(@"\d{{4}}\u{0:X4}(\d{{2}}\u{0:X4}){{4}}\w{{8}}.\w{{3}}", Convert.ToInt32(Path.DirectorySeparatorChar, CultureInfo.InvariantCulture)); 

     return Regex.Match(fullPath, regexconvention).Value; 
    } 
} 
+1

저는 Regex 아이디어가 마음에 들지만 초기 백 슬래시를 앞에 표시합니다. 어떤 방법 으로든 그것을 돌려 줄 수 없으므로 Path.Combine에서 제대로 사용할 수 있습니까? 물론 – michael

+0

! 나는 대답을 업데이트했기 때문에 슬래시가 없다. –

+1

OP가 그것을 사용했기 때문에 Regex가'Path.DirectorySeparatorChar'를 사용하여 구성되어야한다. (그리고 그것은 filepaths로 작업 할 때 적절한 방법이기 때문이다.). –

0

는 C# 솔루션은 여기에 당신이 찾고있는 형식은 항상 \ YYYY \ MM \ DD \ HH \ mm가 들어 가정, 정규 표현식을 사용하는 솔루션입니다

string str = @"C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt"; 
string[] arr=str.Substring(str.IndexOf("2012")).Split(new char[]{'\\'}); 
4
static void Main(string[] args) 
    { 
     Console.WriteLine(GetLastParts(@"D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq", @"\", 6)); 
     Console.ReadLine(); 
    } 

    static string GetLastParts(string text, string separator, int count) 
    { 
     string[] parts = text.Split(new string[] { separator }, StringSplitOptions.None); 
     return string.Join(separator, parts.Skip(parts.Count() - count).Take(count).ToArray()); 
    } 
+3

'Take'는 쓸모가 없습니다. 'parts.Length - count' 부분을 건너 뛴 후에는 * count * 부분 만 남아 있습니다. –

0

나는 현재의 접근 방식에 문제가 있다고 생각하지 않습니다. 그 일에 가장 적합한 것 같습니다.

public string GetFilepath(int nth, string needle, string haystack) { 
    int lastindex = haystack.Length; 

    for (int i=nth; i>=0; i--) 
     lastindex = haystack.LastIndexOf(needle, lastindex-1); 

    return haystack.Substring(lastindex); 
} 

나는 간단하게 유지합니다 (KISS). 디버그/유지 관리가 쉽고 정규 표현식보다 두 배 빠릅니다.

관련 문제