Dosya veya Dizin isimlendirirken kullanmamanız gereken karakterler

System.IO namespace‘inde yer alan Path class‘ının

GetInvalidFileNameChars()

GetInvalidPathChars()

methodlarını kullanarak dosya veya dizin isimlendirirken kullanmamanız gereken karakterleri bulabilirsiniz.

Her iki method’dan da geriye char[] döner.

MSDN’de şuradaki makaleden GetInvalidFileNameChars() methodu ile ilgili ayrıntılı bilgiye ulaşabilirsiniz.

MSDN’de şuradaki makaleden GetInvalidPathChars() methodu ile ilgili ayrıntılı bilgiye ulaşabilirsiniz.

Uygulamadan aynı anda bir tane açılmasını garantilemek

Yazdığımız uygulamalardan aynı anda sadece bir tane açık olmasını isteyebiliriz. Bunu garantilemek için, yapmamız gereken process’ler arası iletişim kanalı oluşturmak ve kullanmak olmalıdır.

C# dilinde process’ler arası iletişim (cross-process communication) Mutex sınıfı ile sağlanır.

Mutex sınıfının kullanımını hemen bir örnek ile inceleyelim;

[STAThread] static void Main() { bool AcikUygulamaVar = false; Mutex m = new Mutex(true, “UygulamanınAdı”, out AcikUygulamaVar); if (AcikUygulamaVar) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } else { MessageBox.Show(“Uygulamadan aynı anda bir tane açabilirsiniz!”); } }

Mutex sınıfı ile ilgili daha detaylı bilgiye MSDN‘deki şu makaleden ulaşabilirsiniz.

.Net 4 COM İyileştirmeleri - Office Uygulamarı ile Çalışmak

.Net 4.0 COM İyileştirmeleri başlığı altında birçok yeni yeteneğe sahiptir. Şubat ayında verdiğim seminerlerden C# 4.0 Yenilikleri - 2 seminerinde COM İyileştirmeleri başlığında özellikle bu yeniliklerden bahsettim.

BilgeAdam‘daki bir öğrencimin sorusu üzerine bu yazımda Excel ve Word kullanımına ilişkin bir örnek yapacağım.

Öncelikle yeni bir Console Application projesi oluşturalım ve referanslara

  • Microsoft.Office.Interop.Excel
  • Microsoft.Office.Interop.Word

referanslarını ekleyelim.

Bu örnekte yapmak istediğimiz;

  • Bilgisayarımızda o anda en çok hafıza alanı kullanan 10 uygulamanın adını ve kulandığı hafıza miktarını yeni bir Excel dosyasında iki sütuna alt alta yazmak
  • Aynı excel dosyasının ikinci bir sheet’ine bu tablodan bir chart üretmek
  • Bu chart’ı kopyalayıp, yeni açacağımız bir Word dosyasına yapıştırmak

Hazırsanız, Program.cs dosyamıza aşağıdaki kodları yazmakla başlayalım;

using direktiflerini yazdığımz yere

using Excel = Microsoft.Office.Interop.Excel; using Word = Microsoft.Office.Interop.Word; using System.Diagnostics;</pre>

satırlarını ekleyelim

Yeni bir Excel dosyası oluşturmak ve görünür kılmak için;

var excel = new Excel.Application();
excel.Visible = true;

Bu Excel dosyasına yeni bir sheet eklemek ve tablonun başlıklarını yazmak için;

excel.Workbooks.Add();
excel.Cells[1, 1].Value = "Uygulama Adı";
excel.Cells[1, 2].Value = "Hafıza Kullanımı";

Tabloya en çok hafıza kullanan uygulamaları eklemek için;

int i = 2;
foreach (var p in Process.GetProcesses().OrderByDescending(p => p.WorkingSet64).Take(10))
{
    excel.Cells[i, 1].Value = p.ProcessName;
    excel.Cells[i, 2].Value = p.WorkingSet64;
    i++;
}

Tabloyu Excel dosyasında yeni bir sheet içerisine chart olarak eklemek için;

Excel.Range range = excel.Cells[1, 1];
Excel.Chart chart = excel.ActiveWorkbook.Charts.Add(After: excel.ActiveSheet);
chart.ChartWizard(Source: range.CurrentRegion, Title: Environment.MachineName + " Toplam Hafıza Kullanımı");
chart.ChartStyle = 45;

Tabloyu panoya kopyalamak, yeni bir Word dosyası açıp, içine yapıştırmak için;

chart.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap, Excel.XlPictureAppearance.xlScreen);

var word = new Word.Application();
word.Visible = true;
word.Documents.Add();
word.Selection.Paste();

Tüm kodları tekrar yazarsak;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
using System.Diagnostics;

namespace COMIyilestirmeleri_OfficeUygulamasi
{
    class Program
    {
        static void Main(string[] args)
        {
            var excel = new Excel.Application();
            excel.Visible = true;
            excel.Workbooks.Add();
            excel.Cells[1, 1].Value = "Uygulama Adı";
            excel.Cells[1, 2].Value = "Hafıza Kullanımı";
            int i = 2;
            foreach (var p in Process.GetProcesses().OrderByDescending(p => p.WorkingSet64).Take(10))
            {
                excel.Cells[i, 1].Value = p.ProcessName;
                excel.Cells[i, 2].Value = p.WorkingSet64;
                i++;
            }
            Excel.Range range = excel.Cells[1, 1];
            Excel.Chart chart = excel.ActiveWorkbook.Charts.Add(After: excel.ActiveSheet);
            chart.ChartWizard(Source: range.CurrentRegion, Title: Environment.MachineName + " Toplam Hafıza Kullanımı");
            chart.ChartStyle = 45;
            chart.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap, Excel.XlPictureAppearance.xlScreen);

            var word = new Word.Application();
            word.Visible = true;
            word.Documents.Add();
            word.Selection.Paste();
        }
    }
}


Sql Server Tablonun Kolonunun İsmini Değiştirmek

Neden olduğunu anlayamadığım bir sebepten dolayı Microsoft tablodaki bir kolonun ismini değiştirmek için bir tool sunmuyor.

Peki bir kolonun ismini değiştirmek istersek ne yapmalıyız?

MSDN‘de yer alan şu makalede anlatıldığı gibi, sp_rename stored procedure‘ünü kullanabiliriz.

Örneğin;

EXEC sp_rename ‘TabloAdi.KolonAdi’, ‘YeniKolonAdi’, ‘COLUMN’;

Üçüncü parametrenin alabileceği diğer değerler;

COLUMN : Bir kolonun yeniden isimlendirileceğini belirtir DATABASE : Veritabanının yeniden isimlendirileceği durumda kullanılır INDEX : Kullanıcının oluşturduğu index yeniden isimlendirileceğinde kullanılır

FileStream sınıfına Kaydet() ExtensionMethod'u yazalım

FileStream sınıfına yazacağımız Save() method’u sayesinde, aşağıdaki kodu kolaylıkla yazabilir olacağız. Üstelik bir tane de overload yazarak, varolan dosyanın üstüne yazmasını engelleyip, yeni bir dosya adı oluşturup yazma işlemine devam ettirebileceğiz.

fs.Kaydet(“c:\dosya_adi.uzanti”);</pre>

Eğer aynı kodu, ikinci bir boolean parametreye true değeri vererek çağırırsak, klasörde dosya_adi.uzanti dosyası varsa dosya_adi[1].uzanti dosyasına yazmayı deneyecek, eğer bu dosya da varsa, dosya_adi[2].uzanti dosyasına deneyecek, vs..

fs.Kaydet("c:\\dosya_adi.uzanti", true);

İşte kodumuz;

namespace ExtensionManager
{
    public static class Extensions
    {
        public static string Kaydet(this FileStream Dosya, string Dizin)
        {
            return Dosya.Kaydet(Dizin, false);
        }

        public static string Kaydet(this FileStream Dosya, string Dizin, bool UstuneYaz)
        {
            int DosyaSayac = 1;

            string _Dizin = Path.GetDirectoryName(Dizin);

            if (!Directory.Exists(_Dizin))
                Directory.CreateDirectory(_Dizin);

            int DosyaBoyu = Convert.ToInt32(Dosya.Length);
            string DosyaAdi = Path.GetFileName(Dosya.Name);

            Byte[] b = new Byte[DosyaBoyu];
            Dosya.Read(b, 0, DosyaBoyu);

            string root = Path.GetDirectoryName(Dizin) + "\\" + Path.GetFileNameWithoutExtension(Dizin);

            while (!UstuneYaz && File.Exists(Dizin))
                Dizin = root + "[" + DosyaSayac++.ToString() + "]" + Path.GetExtension(Dizin);

            File.WriteAllBytes(Dizin, b);

            return Path.GetFileName(Dizin);
        }
    }
}


Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı