Я сделал этот фрагмент ... не уверен, что все соответствует спецификации:
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
Это - довольно простая реализация, которая предполагает, что файл и каталоги все существуют и доступны:
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);
}
Существует ошибка с этим, хотя: Относительные пути преобразовываются в полные пути. Ваш исходный код выше сделал то же, таким образом, я предполагаю, что Вы действительно хотите это поведение.
Ниже хорошо работает до степени, которую я протестировал..., только выгода - то, что используемый 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);
Можно ли искать файл, Вы хотите надеть случай и возвратить результаты Вашего поиска (Вы хотите проверить преобразование регистра файла, который существует, правильно?). Что-то вроде этого:
public static string GetProperFilePathCapitalization(string filepath) {
string directoryPath = Path.GetDirectoryName(filepath);
string[] files = Directory.GetFiles(directoryPath, Path.GetFileName(filepath));
return files[0];
}
Это то, что Вы ищете?
У меня есть что-то более эффективное, но:
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);