В одном из проектов мне понадобилось конвертировать массив байтов bytes[] в поток System.IO.Stream. Так как я вплотную потоками не работал, то моя работа затормозилась. Пришлось искать решение в интернете. Оказалось, что мы не одиноки во Вселенной. Одного человека также интересовал этот вопрос, который он задал на форуме ASP.NET Mania. Добрый человек откликнулся на просьбу и предложил решение в виде класса. Я вытащил из кода нужную мне функциональность, но своей странице FAQ оставил оригинальную версию. Вдруг, спустя некоторое время, мне опять понадобится работать с потоками.
public static class StreamConverter
{
public static Stream ToStream(byte[] bytes)
{
return new MemoryStream(bytes);
}
public static byte[] ToBytes(Stream stream)
{
long initialPosition = stream.Position;
stream.Position = 0;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Position = initialPosition;
return bytes;
}
}
Удачного вам программирования!
вторник, 6 мая 2008 г.
воскресенье, 27 апреля 2008 г.
Как создавать zip-архивы
Каждое утро на моей работе начинается с одной и той же операции. Необходимо скопировать с сервера пять xls-файлов на свой компьютер и заархивировать их в zip-файлы, чтобы выложить их на ftp-сервер. Раньше эту работу делали вручную, но в конце концов мне надоело выполнять одну и ту же последовательность действий и я решил написать для себя небольшую утилитку. Копирование файлов с одного компьютера на другой не представляет интереса, а вот архивирование файлов в zip-формат оказалось не таким простым делом. Пришлось обратиться к помощи Google, чтобы узнать больше об этой проблеме. После непродолжительных поисков я нашел пять различных способов архивации файлов. Например, можно запустить процесс WinZip c необходимыми параметрами. Но у меня на компьютере нет программы WinZip, поэтому такой способ мне не подходит. Существуют более удобные способы для архивации в виде специальных библиотек. Большинство этих библиотек бесплатны и с открытым исходным кодом. Я протестировал часть самых популярных библиотек в своих примерах и решил остановиться на библиотеке DotNet Zip, которую можно найти по адресу http://www.codeplex.com/DotNetZip.
Чтобы воспользоваться этой библиотекой, необходимо добавить ссылку на Ionic.Utils.Zip и написать, например, такой код:
using (ZipFile zip = new ZipFile("MyZipFile.zip")
{
zip.AddFile(@"c:\photos\cat.jpg");
zip.AddFile(@"c:\Desktop\kitty.jpg");
zip.AddFile("ReadMe.txt");
zip.Save();
}
Вы можете скачать готовую библиотеку, исходный код, документацию, инсталлятор. На сегодняшний день библиотека DotNet Zip имет версию 1.3 (есть еще бета-версия 1.4).
Сразу оговорюсь, что я не проверял производительность при архивации файлов разными библиотеками, а также не рассматривал их функциональные возможности. Я решал конкретную задачу и данное решение полностью удовлетворило меня. Теперь работа, которая отнимала у меня полчаса драгоценного времени, выполняется в течении минуты. Сейчас я тестирую программу на предмет отправки файлов на ftp-сервер. Но об этом в следующий раз.
А вам удачного программирования!
Христос воскресе!
Чтобы воспользоваться этой библиотекой, необходимо добавить ссылку на Ionic.Utils.Zip и написать, например, такой код:
using (ZipFile zip = new ZipFile("MyZipFile.zip")
{
zip.AddFile(@"c:\photos\cat.jpg");
zip.AddFile(@"c:\Desktop\kitty.jpg");
zip.AddFile("ReadMe.txt");
zip.Save();
}
Вы можете скачать готовую библиотеку, исходный код, документацию, инсталлятор. На сегодняшний день библиотека DotNet Zip имет версию 1.3 (есть еще бета-версия 1.4).
Сразу оговорюсь, что я не проверял производительность при архивации файлов разными библиотеками, а также не рассматривал их функциональные возможности. Я решал конкретную задачу и данное решение полностью удовлетворило меня. Теперь работа, которая отнимала у меня полчаса драгоценного времени, выполняется в течении минуты. Сейчас я тестирую программу на предмет отправки файлов на ftp-сервер. Но об этом в следующий раз.
А вам удачного программирования!
Христос воскресе!
воскресенье, 20 апреля 2008 г.
SoundPlayer
В .NET Framework 2.0 появилась поддержка звуковых файлов и теперь не нужно прибегать к услугам функций Windows API PlaySound. Для проигрывания звуковых файлов используется класс SoundPlayer из пространства имен System.Media. Приведу небольшой кусок с использованиме этого класса. Более подробно о новых классах вы можете прочитать в документации MSDN или в моем справочнике по .NET Framework.
using System.Media;
SoundPlayer player = new SoundPlayer();
player.SoundLocation = "c:/tada.wav";
player.Play();
Будьте внимательны, поддержка этого класса в .NET Compact Framework доступна только в версии 3.5.
P.S. Кстати, я обзавелся новым электронным адресом klimoff@csfan.ru. CSFAN - это, наверное, фанат C#. Ну что ж, пусть будет еще один адрес. Можете слать на это мыло свои сообщения. Вы также можете приобрести такой адрес, если пройдете на сайт http://www.mailnica.ru/. На этом сайте Майкрософт предлагает на выбор самые разнообразные адреса, например, дочь танкиста.ру или дайте-денег.ру
using System.Media;
SoundPlayer player = new SoundPlayer();
player.SoundLocation = "c:/tada.wav";
player.Play();
Будьте внимательны, поддержка этого класса в .NET Compact Framework доступна только в версии 3.5.
P.S. Кстати, я обзавелся новым электронным адресом klimoff@csfan.ru. CSFAN - это, наверное, фанат C#. Ну что ж, пусть будет еще один адрес. Можете слать на это мыло свои сообщения. Вы также можете приобрести такой адрес, если пройдете на сайт http://www.mailnica.ru/. На этом сайте Майкрософт предлагает на выбор самые разнообразные адреса, например, дочь танкиста.ру или дайте-денег.ру
понедельник, 14 апреля 2008 г.
Не прислоняться или детская забава
Когда я учился в школе, мне приходилось ездить каждый день на метро, начиная с 5 класса. Чтобы первым успевать к экскалатору или к переходу на другую ветку, я старался держаться около дверей вагона. В течении получаса передо мной маячила надпись Не прислоняться, написанная на каждой двери вагона московского метро. Сначала я смотрел на эту надпись снизу вверх, потом надпись была на уровне моих глаз, а когда заканчивал школу, то смотрел на нее уже свысока))). Чтобы не скучать, я придумал себе простое занятие - составлять слова из букв, входящих в эту надпись. Слова из трех или четырех букв придумать было достаточно просто: стол, слон, нос, сон, лот и т.п. Когда легкие слова закончились, я пытался найти уже более сложные слова. И испытывал радость, когда получалось составить какое-нибудь новое слово. Например, удалось найди шестибуквенные слова типа пистон, пионер. Были даже семибуквенные находки - престол. Позже, когда я увлекся программированием, я поймал себя на мысли - как было бы здорово написать программу, которая сама найдет все существующие варианты. Эта была моя детская мечта. Как хорошо было бы, если эту задачку предложили на олимпиаде для программистов. Так хочется узнать все слова, зашифрованные в этой незамысловатой надписи. Как я себе представляю, эту задачу можно разделить на два этапа. Первый этап - комбинаторная задача, которая сводится к получению всех возможных перестановок букв. Вторая задача - сверка получившихся комбинаций с каким-то большим словарем, чтобы оставить только осмысленные слова. Вот такая у меня была детская забава.
четверг, 20 марта 2008 г.
GetDrives и IsReady
Сегодня продолжим разговор о новинках, которые появились в .NET Framework 2.0. Рассмотрим метод GetDrives и свойство IsReady из класса DriveInfo. Метод GetDrives получает массив имен всех логических дисков на компьютере. Естественно, используя этот массив, мы можем пройтись по всем дискам и получить информацию о каждой диске. Но, чтобы не нарваться на ошибку, желательно воспользоваться свойством IsReady, который определяет доступность диска, например, можно определить наличие компакт-диска в CD-ROM. Берем на вооружение все вышесказанное и пишем следующий пример.
using System;
using System.IO;
class Test
{
public static void Main()
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
Console.WriteLine("Диск {0}", d.Name);
Console.WriteLine(" Тип диска: {0}", d.DriveType);
if (d.IsReady == true)
{
Console.WriteLine(" Полный размер диска: {0, 15} bytes ", d.TotalSize);
}
}
}
}
Описываемые метод и свойство я добавил в свой справочник по .NET Framework, доступный зарегистрированным пользователям. Кстати, вы можете бесплатно получить один выпуск справочника, если выполните одно условие. Вам необходимо выбрать любой пример, написанный на Visual Basic 6.0 с сайта Русский_Проект и портировать его на язык C# или VB.NET. Хочу обратить ваше внимание, что нужно, именно, портировать исходник, а не присылать похожий пример. Примеры можете присылать по адресу rusproject@mail.ru.
Удачного вам программирования!
using System;
using System.IO;
class Test
{
public static void Main()
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
Console.WriteLine("Диск {0}", d.Name);
Console.WriteLine(" Тип диска: {0}", d.DriveType);
if (d.IsReady == true)
{
Console.WriteLine(" Полный размер диска: {0, 15} bytes ", d.TotalSize);
}
}
}
}
Описываемые метод и свойство я добавил в свой справочник по .NET Framework, доступный зарегистрированным пользователям. Кстати, вы можете бесплатно получить один выпуск справочника, если выполните одно условие. Вам необходимо выбрать любой пример, написанный на Visual Basic 6.0 с сайта Русский_Проект и портировать его на язык C# или VB.NET. Хочу обратить ваше внимание, что нужно, именно, портировать исходник, а не присылать похожий пример. Примеры можете присылать по адресу rusproject@mail.ru.
Удачного вам программирования!
среда, 12 марта 2008 г.
Перетаскивание строчек кода в IDE
Сегодня в блоге Сары Форд (надеюсь, все уже нашли адрес ее блога и подписались?) прочитал очень интересный совет.
Сначала вспомним, как обычно мы управляем строчками кода. Если нужно переместить строчки кода в другое место, то просто выделяем нужный фрагмент и перемещаем текст (а-ля Word). Если нужно скопировать кусочек текста, то мы сначала выделяем текст, выбираем команду Copy, щелкаем мышкой в другом месте редактора кода и сновы вызываем контекстное меню для команды Paste (либо пользуемся комбинациями клавиш). Но есть еще один интересный способ. Выделите строчку кода, затем нажмите на правую кнопку мыши и, удерживая ее, перетащите выделенную строчку в нужное место. Когда вы отпустите кнопку мыши, то
увидите всплывающее меню с командами "Move here, Copy here и Cancel." Очень удобно для быстрого копирования или перемещения кода. Возьмите на заметку. Счастливого вам программирования!
Сначала вспомним, как обычно мы управляем строчками кода. Если нужно переместить строчки кода в другое место, то просто выделяем нужный фрагмент и перемещаем текст (а-ля Word). Если нужно скопировать кусочек текста, то мы сначала выделяем текст, выбираем команду Copy, щелкаем мышкой в другом месте редактора кода и сновы вызываем контекстное меню для команды Paste (либо пользуемся комбинациями клавиш). Но есть еще один интересный способ. Выделите строчку кода, затем нажмите на правую кнопку мыши и, удерживая ее, перетащите выделенную строчку в нужное место. Когда вы отпустите кнопку мыши, то
увидите всплывающее меню с командами "Move here, Copy here и Cancel." Очень удобно для быстрого копирования или перемещения кода. Возьмите на заметку. Счастливого вам программирования!
воскресенье, 2 марта 2008 г.
Недавно в справочник добавил пример с применением функций SetPowerRequirement и ReleasePowerRequirement. С помощью этих функций можно сделать так, чтобы экран мобильного устройства не выключался, если долго не нажимать на кнопки или не пользоваться пером. Это может пригодиться, например, при просмотре видео. Приведу объявление одной функции на VB:
Declare Function SetPowerRequirement Lib "coredll.dll" (ByVal pvDevice As String, _ ByVal DeviceState As PowerState, _ ByVal DeviceFlags As Integer, _ ByVal pvSystemState As IntPtr, _ ByVal StateFlags As Integer) As IntPtr
Чтобы экран не выключался, нужно сделать так:
' Отключаем автоматическое выключение экрана
Public Sub Activate()
'request full power handle = SetPowerRequirement("BKL1:", CEDEVICE_POWER_STATE.D0, 1, IntPtr.Zero, 0)
End Sub
Более полное описание функций и примеры на C# и Visual Basic можно найти в справочнике по функциям Windows API.
Кстати, новость для тех, кто интересуется программированием для мобильных устройств. Microsoft поменяла главную страницу Windows Mobile Developer Center. Теперь на этой странице в более удобном виде собраны ресурсы для разработчика под платформу Windows Mobile. Рекомендую всем. (А вечером многие страницы Microsoft были недоступны. Надеюсь, это временное явление).
Declare Function SetPowerRequirement Lib "coredll.dll" (ByVal pvDevice As String, _ ByVal DeviceState As PowerState, _ ByVal DeviceFlags As Integer, _ ByVal pvSystemState As IntPtr, _ ByVal StateFlags As Integer) As IntPtr
Чтобы экран не выключался, нужно сделать так:
' Отключаем автоматическое выключение экрана
Public Sub Activate()
'request full power handle = SetPowerRequirement("BKL1:", CEDEVICE_POWER_STATE.D0, 1, IntPtr.Zero, 0)
End Sub
Более полное описание функций и примеры на C# и Visual Basic можно найти в справочнике по функциям Windows API.
Кстати, новость для тех, кто интересуется программированием для мобильных устройств. Microsoft поменяла главную страницу Windows Mobile Developer Center. Теперь на этой странице в более удобном виде собраны ресурсы для разработчика под платформу Windows Mobile. Рекомендую всем. (А вечером многие страницы Microsoft были недоступны. Надеюсь, это временное явление).
Подписаться на:
Сообщения (Atom)