Перепреобразование регистра C# Filepath

Я сделал этот фрагмент ... не уверен, что все соответствует спецификации:

var startDate = new DateTime(2018, 11, 1);
var endDate = new DateTime(2018, 12, 31);

int diff = (7 + (startDate.DayOfWeek - DayOfWeek.Monday)) % 7;
var weekStartDate = startDate.AddDays(-1 * diff).Date;
var i = 1;
var weekEndDate = DateTime.MinValue;    
while(weekEndDate < endDate) {
    weekEndDate = weekStartDate.AddDays(6);
    var shownStartDate = weekStartDate < startDate ? startDate : weekStartDate;
    var shownEndDate = weekEndDate > endDate ? endDate : weekEndDate;
    Console.WriteLine($"Week {i++}: {shownStartDate:dd MMMM yyyy} - {shownEndDate:dd MMMM yyyy}");
    weekStartDate = weekStartDate.AddDays(7);
}

Это предполагает, что ваши недели «считаются», начиная с той недели, в которой находится дата начала, и использует понедельник - первый день недели, а воскресенье - последний (диапазоны, которые вы видите, - понедельник - воскресенье, за исключением первой / последней недели, в которой вместо даты начала / конца будет использоваться дата, если это не понедельник или воскресенье )

Вы можете запустить его онлайн здесь: https://dotnetfiddle.net/jJ4Ydu

Если вам также необходимо узнать, какая это неделя года, тогда это зависит от того, хотите ли вы стиль .NET или стиль ISO8601 ... типичным является последний, и вы можете использовать, например, метод, найденный в в этом ответе , чтобы он выглядел как-то например: https://dotnetfiddle.net/oJscjF

Обратите внимание, что 31 декабря 2018 года (понедельник) является 1-й неделей 2019 года по ISO8601, но 53-й для .NET

21
задан John Sheehan 28 January 2009 в 07:21
поделиться

4 ответа

Это - довольно простая реализация, которая предполагает, что файл и каталоги все существуют и доступны:

static string GetProperDirectoryCapitalization(DirectoryInfo dirInfo)
{
    DirectoryInfo parentDirInfo = dirInfo.Parent;
    if (null == parentDirInfo)
        return dirInfo.Name;
    return Path.Combine(GetProperDirectoryCapitalization(parentDirInfo),
                        parentDirInfo.GetDirectories(dirInfo.Name)[0].Name);
}

static string GetProperFilePathCapitalization(string filename)
{
    FileInfo fileInfo = new FileInfo(filename);
    DirectoryInfo dirInfo = fileInfo.Directory;
    return Path.Combine(GetProperDirectoryCapitalization(dirInfo),
                        dirInfo.GetFiles(fileInfo.Name)[0].Name);
}

Существует ошибка с этим, хотя: Относительные пути преобразовываются в полные пути. Ваш исходный код выше сделал то же, таким образом, я предполагаю, что Вы действительно хотите это поведение.

22
ответ дан 29 November 2019 в 21:32
поделиться

Ниже хорошо работает до степени, которую я протестировал..., только выгода - то, что используемый API доступен только в Vista.

static void Main(string[] args)
{
    using (FileStream fs = File.OpenRead(@"D:\temp\case\mytest.txt"))
    {
        StringBuilder path = new StringBuilder(512);
        GetFinalPathNameByHandle(fs.SafeFileHandle.DangerousGetHandle(), path, path.Capacity, 0);
        Console.WriteLine(path.ToString());
    }
}

[DllImport("kernel32.dll", SetLastError = true)]
static extern int GetFinalPathNameByHandle(IntPtr handle, [In, Out] StringBuilder path, int bufLen, int flags);
3
ответ дан 29 November 2019 в 21:32
поделиться

Можно ли искать файл, Вы хотите надеть случай и возвратить результаты Вашего поиска (Вы хотите проверить преобразование регистра файла, который существует, правильно?). Что-то вроде этого:

public static string GetProperFilePathCapitalization(string filepath) {
   string directoryPath = Path.GetDirectoryName(filepath);
   string[] files = Directory.GetFiles(directoryPath, Path.GetFileName(filepath));
   return files[0];
}

Это то, что Вы ищете?

1
ответ дан 29 November 2019 в 21:32
поделиться

У меня есть что-то более эффективное, но:

1) Это, кажется, не работает на все случаи. (Я не выяснил шаблон, которых файлов и каталогов это правильно получает преобразование регистра, и которые это не делает.)

2) Это - конкретный Windows.

static string GetProperFilePathCapitalization1(string filename)
{
    StringBuilder sb = new StringBuilder(260);
    int length = GetLongPathName(filename, sb, sb.Capacity);

    if (length > sb.Capacity)
    {
        sb.Capacity = length;
        length = GetLongPathName(filename, sb, sb.Capacity);
    }

    if (0 == length)
        throw new Win32Exception("GetLongPathName");

    return sb.ToString();
}

[DllImport("kernel32.dll")]
static extern int GetLongPathName(string path, StringBuilder pszPath, int cchPath);
1
ответ дан 29 November 2019 в 21:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: