2013-09-18 4 views
2

У меня есть некоторые подкаталоги, которые называются с датами, как так:C# DateTime.ParseExact с обратными косыми чертами в формате

C:\SomeDirectory\201309\01 
C:\SomeDirectory\201309\02 
C:\SomeDirectory\201309\03 
C:\SomeDirectory\201309\04 
C:\SomeDirectory\201309\05 

т.д.

То, что я пытаюсь сделать, это получить каталог а затем использовать Linq для ограничения моих результатов на основе диапазона дат.

Я получил это работает так:

string path = @"C:\SomeDirectory"; 
DateTime f = new DateTime(2013, 9, 1); 
DateTime t = new DateTime(2013, 9, 3); 
DateTime dt; 
var dirs = 
    Directory.GetDirectories(path, "*.*", SearchOption.AllDirectories) 
      .Where(d => DateTime.TryParseExact(
       d.Substring(Math.Max(0, d.Length - 9)).Replace("\\", null), 
       "yyyyMMdd", 
       CultureInfo.Invarient, 
       DateTimeStyles.None, 
       out dt) 
       && f <= dt 
       && dt <= t); 

Я бы, однако, хотел изменить часть TryParseExact так, что я не должен заменить обратную косую черту - например, так:

DateTime.TryParseExact(
    d.Substring(Math.Max(0, d.Length - 9)), 
    @"yyyyMM\dd", 
    CultureInfo.Invarient, 
    DateTimeStyles.None, 
    out dt) 

Но, кажется, TryParseExact не нравится этот формат. Я думал, что это может иметь какое-то отношение к CultureInfo, но я не смог найти возможное решение, чтобы помочь мне с обратной косой чертой.

Любая помощь была бы принята с благодарностью!

+1

Вы пробовали двойную обратную косую черту? Обратная косая черта - это особый символ, который использует форматирование 'DateTime'. Я считаю, что больше информации [здесь] (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx). –

+0

Вы также можете попробовать использовать значение символа обратной косой черты (найти его в таблице ASCII) – NDraskovic

+0

Почему вы не ищете только один каталог под 'SomeDirectory'? Или вы можете сначала проверить: 'Где (d => d.Length == 6 && d.All (Char.IsDigit))' –

ответ

6

Согласно Custom Date and Time Format Strings на MSDN \ является символом эвакуации. Таким образом, в @"yyyyMM\dd" он удалил особый смысл с первых d. Вы должны спасаясь от \ вместо:

Чтобы включить обратную косую черту в строки результата, вы должны экранировать его с другой обратной косой черты (\\).

Так что попробуйте следующее:

DateTime.TryParseExact(
    d.Substring(Math.Max(0, d.Length - 9)), 
    @"yyyyMM\\dd", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out dt) 
+2

И без '@' он выглядит еще круче: '' yyyyMM \\\\ dd "'! – BartoszKP

+0

Я на самом деле просто вычислил это случайно - думая, что, возможно, мне нужно было сбежать от него - и сделал ваше точное предложение. Я помечаю это как ответ в ближайшее время. Спасибо :) –

Смежные вопросы