Вопрос + ответ = Совет

Новые советы находятся по адресу developer.alexanderklimov.ru/faq.php

Как укоротить длинный путь к файлу

Если вам необходимо показать путь к файлу, например, в MessageBox, то слишком длинная строка будет выглядеть не очень красиво. Можно укоротить ее определенным образом, оставив названия первых двух папок, последнюю папку и имя файла. А среднюю часть путь можно заменить многоточием (...). Воспользуемся для этой цели регулярным выражением.


static string PathShortener(string path)
{
    const string pattern = @"^(\w+:|\\)(\\[^\\]+\\[^\\]+\\).*(\\[^\\]+\\[^\\]+)$";
    const string replacement = "$1$2...$3";
    if (Regex.IsMatch(path, pattern))
    {
        return Regex.Replace(path, pattern, replacement);
    }
    else
    {
        return path;
    }
} 

Теперь, вы можете вызвать данный метод для укорачивания длинного пути.


string myPath = @"C:\Documents and Settings\jatwood\My Documents\Visual Studio 2005\SimpleEncryption\UnitTests\UnitTests.vb\wumpus\public\Hilo Deliverables\Hilo Final\Introduction\Code\Intro\App_Themes\cellphone\photo-small.jpg";
            
MessageBox.Show(PathShortener(myPath));

У вас выведется путь: C:\Documents and Settings\jatwood\...\cellphone\photo-small.jpg (Источник: Coding Horror).
Существует еще вариант с использованием функции Windows API PathCompactPathEx, описаный в книге C#. Советы программистам. Системная фукнция работает по другому алгоритму, поэтому вы можете выбрать удобный для вас способ.

Как сделать TextBox, позволяющий вводить только цифры?

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

Подключен ли компьютер к интернету?

Определить, подключен ли компьютер к интернету, можно при помощи метода NetworkInterface.GetIsNetworkAvailable. Следует заметить, что если компьютер подключен к локальной сети, то этот способ окажется бесполезным, так как ваша машина может иметь подключение к сети, но не иметь выхода в интернет. В этом случае попробуйте воспользоваться функцией Windows API InternetGetConnectedState, которая описана в моей книге C#.Cоветы программистам или в справочнике по функциям Windows API.


MessageBox.Show("Наличие подключения: " + 
    System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable().ToString());

Как создать ссылку (*.url) на страницу в Интернете

Ссылка Интернета является текстовым файлом с расширением URL и с определенной структурой записи, схожей с конфигурационными файлами INI. Вы можете программно создать такую ссылку, скажем, на Рабочем столе


//  Функция-обертка для создания ссылки интернета 
private void CreateInternetShortCut(string FileName, string URL)
{
    using (StreamWriter sw = new StreamWriter(FileName))
    {
        sw.WriteLine("[InternetShortcut]");
        sw.WriteLine("URL=" + URL);
        sw.WriteLine();

    }
}

private void Form1_Load(object sender, EventArgs e)
{
    // У вас будет свой путь к файлу
    CreateInternetShortCut(@"d:\mysite.url", "http://netsources.narod.ru");
}

Как определить версию операционной системы

На данный момент Windows Vista SP1 и Windows Server 2008 имеют одинаковые номера 6.0.6001. Поэтому, чтобы различать эти системы, нужно прочитать дополнительно значения из реестра.


private const string  REG_PRODUCT_KEY = @"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion";

private string GetOSVersion()
{
    OperatingSystem osInfo = Environment.OSVersion;
    string osName = "Не определено";

    switch (osInfo.Platform)
    {
         case PlatformID.Win32NT:
            {
                switch (osInfo.Version.Major)
                {
                    
                   case 5:
                        {
                            if (osInfo.Version.Minor == 0)
                            {
                                osName = "Windows 2000";
                            }
                            else if (osInfo.Version.Minor == 1)
                            {
                                osName = "Windows XP";
                            }
                            else if (osInfo.Version.Minor == 2)
                            {
                                osName = "Windows Server 2003";
                            }
                            break;
                        }

                   case 6:
                        {
                            string info = Microsoft.Win32.Registry.GetValue(REG_PRODUCT_KEY, "ProductName", "").ToString();
                            if (info.ToLower().Contains("vista"))
                            {
                                osName = "Windows Vista";
                            }
                            if (info.ToLower().Contains("server"))
                            {
                                osName = "Windows 2008";
                            }

                            break;
                        }
                }
                break;
            }
    }

    return osName;
}

private void butGetOS_Click(object sender, EventArgs e)
{
    MessageBox.Show(GetOSVersion());
}

Как заставить говорить компьютер

В .NET Framework 3.0 появилось новое пространство имен System.Speech, с помощью которого можно заставить компьютер говорить. Добавьте ссылку на System.Speech в проекте и напишите следующий код.


using System.Speech.Synthesis;

SpeechSynthesizer synth = new SpeechSynthesizer();
synth.Speak("I love .NET Framework!");

Кнопка по умолчанию в MessageBox

Если в MessageBox вы выводите две или три кнопки, то не всегда требуется, чтобы кнопкой по умолчанию была первая кнопка, например, с надписью Да. Если вы хотите, чтобы фокус был на второй кнопке (напр. с надписью Нет), то используйте одну из перегруженных версий метода Show, в которой используется параметр MessageBoxDefaultButton, позволяющая задать кнопку по умолчанию.


MessageBox.Show("Ты согласен?", 
    "Вопрос", 
    MessageBoxButtons.YesNoCancel, 
    MessageBoxIcon.Question, 
    MessageBoxDefaultButton.Button2);

Незаметный» запуск внешних процессов

Иногда возникает необходимость запустить внешний процесс, получить от него какие-либо данные (либо просто дать ему возможность отработать) и затем его закрыть. В .NET Framework для этих целей служит класс System.Diagnostics.Process. Однако внешний процесс становится виден пользователю (часто это можно наблюдать при работе инсталляторов). А вот чтобы запустить внешний процесс незаметно для пользователя, надо в классе настроек запуска процесса ProcessStartInfo свойству WindowStyle присвоить значение ProcessWindowStyle.Hidden. Ниже представлен небольшой пример «незаметного» запуска процессов, который запускает утилиту Reg.exe и делает бэкап ветки реестра HKEY_CLASSES_ROOT\mailto в файл.


static void Main()
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = "reg";
    startInfo.Arguments = @"save HKEY_CLASSES_ROOT\mailto c:\mailto.reg";
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    Process.Start(startInfo);
}

Источник: Блог Будни программиста

Картинки для TreeView

Если вам приходилось раньше использовать элемент TreeView в своих проектах, то, наверняка, задавались вопросом - как использовать вместо плюсиков-минусов привычные картинки открытой или закрытой папки как в Проводнике или использовать свои собственные картинки. Для решения этой проблемы нужно было использовать системное сообщение Windows TVM_SETIMAGELIST. Готовый пример можно посмотреть например на странице FAQ от GotDotNet. Но, начиная с .NET Framework 2.0 у элемента TreeView есть свойства ImageIndex и SelectedImageIndex, которые в сочетании с элементом ImageList, помогут вам обеспечить необходимую функциональность. Пересмотрите свои старые примеры и внесите необходимые изменения.

Как создавать zip-архивы

Существут много способов архивации файлов. Предлагаю воспользоваться библиотекой DotNet Zip, которую можно найти по адресу http://www.codeplex.com/DotNetZip Вы можете скачать готовую библиотеку, исходный код, документацию, инсталлятор. На сегодняшний день библиотека DotNet Zip имет версию 1.5. Чтобы воспользоваться этой библиотекой, необходимо добавить ссылку на 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();
}

Повышение уровня привилегий в Windows Vista

Чтобы повысить уровень привилегий в Windows Vista через системное диалоговое окно UAC, используйте следующее:


Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"cmd.exe");
psi.UseShellExecute = true;
psi.Verb = "runas";
p.StartInfo = psi;
p.Start(); 
В приведенном примере показано, как можно запускать новый процесс с повышенными привилегиями.

Сколько секунд содержится в минутах, часах, сутках

Используя свойство TotalSeconds, можно узнать, сколько секунд содержится в минутах, часах, сутках


// вместо того, чтобы вычислять сколько секунд в одном часе
// int totalseconds = 1 * 60 * 60;
int totalseconds;
totalseconds = (int)TimeSpan.FromMinutes(2).TotalSeconds; // сколько секунд в 2 минутах
Console.WriteLine(totalseconds);

totalseconds = (int)TimeSpan.FromHours(1).TotalSeconds;  // сколько секунд в 1 часе
Console.WriteLine(totalseconds);

totalseconds = (int)TimeSpan.FromDays(1).TotalSeconds;  // сколько секунд в сутках
Console.WriteLine(totalseconds);

Получить маркер текущего процесса

Пример из книги Защищенный код для Windows Vista


using System.Security;
using System.Security.Principal;

try
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    IntPtr token = id.Token;
    // мы получили маркер и выводим на экран
    Console.WriteLine(token.ToString());
}
catch (SecurityException e)
{
    Console.WriteLine(e.Message);
}

Узнать редакцию Windows Vista

Чтобы узнать редакцию Windows Vista (Home Basic, Business и т.д.), нужно вызвать функцию Windows API GetProductInfo. Более подробно об этой фунции можно узнать в моем блоге.

Преобразовать bytes[] в IO.Stream и наоборот


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;			
    }
}

Источник: ASP.NET Mania

ASP.NET

Определить версию Internet Explorer

Обычно, версию браузера пытаются узнать при помощи JavaScript. Но у пользователя сценарии могут быть отключены. Поэтому нужен другой способ, например, использовать объект HttpBrowserCapabilities, который имеется в ASP.NET. Следующий пример показывает, как определить версию Internet Explorer, используя приложение ASP.NET в C#.


protected void Page_Load(object sender, EventArgs e)
{
    string msg;
    double ver = getInternetExplorerVersion();
    if (ver > 0.0)
    {
        if (ver >= 6.0)
            msg = "Вы используете последнюю версию Internet Explorer.";
        else
            msg = "Вам нужно обновить браузер Internet Explorer.";
    }
    else
        msg = "Вы используете не Internet Explorer.";

    Label1.Text = msg;
}

private float getInternetExplorerVersion()
{
    // Возвращает версию Internet Explorer или -1, если это другой браузер
    float rv = -1;
    System.Web.HttpBrowserCapabilities browser = Request.Browser;
    if (browser.Browser == "IE")
        rv = (float)(browser.MajorVersion + browser.MinorVersion);
    return rv;
}
Реклама