Здравствуйте, der Igel, Вы писали:
DI>Hello, All!
DI>Специальный форматер для вывода размеров файлов (10КB, 1,5MB, etc). DI>Объединяя идеи Гайдара и Joshua Flanagan.
А почему бы внутри не использовать банальный интероп для StrFormatByteSizeW — локаль будет автоматически учитываться без лишних телодвижений?
Hello, Anton!
AB> А почему бы внутри не использовать банальный интероп для AB> StrFormatByteSizeW — локаль будет автоматически учитываться без лишних AB> телодвижений?
Во-первых, нас интересует чисто дотнетовское решение, этот вариант и на моно отлично работает.
А во-вторых, с интеропом я тоже пробовал, эта функция регулярно рушилась (но не всегда, что только хуже).
Может я конечно криво писал интеропную функцию, но...
[DllImport("shlwapi.dll", EntryPoint="StrFormatByteSize", CharSet=CharSet.Auto)]
protected static extern string StrFormatByteSize([In] long number, [Out] StringBuilder buffer, [In] int bufferSize);
/// <summary>
/// Converts a numeric value into a string that represents the number expressed as a size value in bytes, kilobytes, megabytes, or gigabytes, depending on the size.
/// </summary>
/// <param name="number">Numeric value to be converted.</param>
/// <returns>Converted text value of numeric value.</returns>public static string BytesToString(long number)
{
StringBuilder buffer = new StringBuilder();
return StrFormatByteSize(number, buffer, buffer.Capacity);
}
Здравствуйте, der Igel, Вы писали:
AB>> А почему бы внутри не использовать банальный интероп для AB>> StrFormatByteSizeW — локаль будет автоматически учитываться без лишних AB>> телодвижений?
DI>Во-первых, нас интересует чисто дотнетовское решение, этот вариант и на моно отлично работает.
Ясно. Просто это как-то не было оговорено.
DI>А во-вторых, с интеропом я тоже пробовал, эта функция регулярно рушилась (но не всегда, что только хуже). DI>Может я конечно криво писал интеропную функцию, но...
Попытался воспроизвести у себя. Со StringBuilder действительно почему-то падает, но не регулярно, а точно на втором вызове. Проверил на другом примере (ниже). Минут 15 уже колбасит — полет нормальный.
[System.Runtime.InteropServices.DllImport("shlwapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
static extern string StrFormatByteSizeW
(
[System.Runtime.InteropServices.In]
ulong qdw,
[System.Runtime.InteropServices.Out]
[System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]
string pwszBuf,
[System.Runtime.InteropServices.In]
uint cchBuf
);
public static string StrFormatByteSize(ulong value)
{
string buf = " "; // от балдыreturn StrFormatByteSizeW(value, buf, (uint)buf.Length);
}
static void Main(string[] args)
{
System.Random random = new System.Random();
while (true)
{
ulong value = (ulong)random.Next();
string result = StrFormatByteSize(value);
System.Console.WriteLine("{0} = {1}", value, result);
System.Threading.Thread.Sleep(10);
}
}