Programınızın çalıştığı dizini kontrol altında tutun

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
NeverFear
Üye
Mesajlar: 69
Kayıt: 20 Tem 2004 09:41
Konum: İzmir

Programınızın çalıştığı dizini kontrol altında tutun

Mesaj gönderen NeverFear »

FormCreate veya FormShow yordamına kodlayınız.

Kod: Tümünü seç

{$I-}
GetLastError;
PATH:= ExtractFilePath(ParamStr(0));
if PATH[Length(PATH)] = '\' then PATH:= Copy(PATH,1,Length(PATH)-1);
ChDir(PATH);
if IOResult <> 0 then MkDir(PATH);
İşinizi görmesi dileğimle,
Çalışmalarınızda başarılar dilerim.

NeverFear - kaheri579@hotmail.com
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Bu tam olarak ne işe yarıyor?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Programınızın çalıştığı dizini kontrol altında tutun

Mesaj gönderen sabanakman »

NeverFear yazdı:FormCreate veya FormShow yordamına kodlayınız.

Kod: Tümünü seç

{$I-}
GetLastError;
PATH:= ExtractFilePath(ParamStr(0));
if PATH[Length(PATH)] = '\' then PATH:= Copy(PATH,1,Length(PATH)-1);
ChDir(PATH);
if IOResult <> 0 then MkDir(PATH);
İşinizi görmesi dileğimle,
Çalışmalarınızda başarılar dilerim.

NeverFear - kaheri579@hotmail.com
fatihtolgaata yazdı:Bu tam olarak ne işe yarıyor?
Sanırım bu kodlardan, oluşturulan kısayoldan çalışan programın, başlama yeri değişik bir yol veya boşsa yararalanılabilinir. Aksi hiç bir ihtimalde işe yarar bir kullanımı aklıma gelmiyor.

Bu kodlar program çalışma klasörünü programın bulunduğu yola ayarlıyor. Zaten tüm exe'ler için çalışma klasörü bulunduğu yoldur. Tabi bu program içinden değiştirilmediği sürece veya program için oluşturulan kısayolda belirtilen çalışma klasörü (Başlama Yeri olarak geçer) başka yolu göstermediği sürece.

Mesela c:\prg klasöründe çalışan bir program için Memo1.Lines.LoadFromFile('Dosya.txt'); kodu yazılırsa bakacağı yol c:\prg klasörüdür. Bu kodla çalışma klasörü ExtractFilePath(ParamStr(0)) (yani program yolu) olarak ayarlanıyor. Biz bunu daha sonra ChDir('D:\test'); kodu ile çalışılan klasörü değiştirir ve yine Memo1.Lines.LoadFromFile('Dosya.txt'); yazarsak bu sefer dosyayı arayacağı yol D:\test klasörüdür. Ancak böyle durumda çalışma klasörünü eski değerine ayarlamak için (örneğe göre c:\prg yapmak için) yukarıdaki kod kullanılabilir. Zira çalışma yolu değiştirimediği sürece program zaten o klasör üzerinden çalışıyor.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
NeverFear
Üye
Mesajlar: 69
Kayıt: 20 Tem 2004 09:41
Konum: İzmir

Mesaj gönderen NeverFear »

Bu kod, install ettiğiniz programınız(ki buna application.title vermişsindir mutlaka) hangi sürücüde olursa olsun hata raporları ve program kırılmalarına neden olmadan çalışmasını sağlamak içindir. Örn.: Programınızı F:\ sürücüsüne install ettiğinizi varsayalım ve kısayolunu oluşturdu. Çalıştırdığınızda gidip de C:\ sürücüsünü aramaz. Ayrıca, Windows illa C:\ sürücüsüne mutlaka kurulması gerekir diye bir şart sözkonusu olamaz. D, E, F, G ... Z sürücülerinden birine de kurulmuş olabilir.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Programınızın çalıştığı dizini kontrol altında tutun

Mesaj gönderen sabanakman »

NeverFear yazdı:...Ayrıca, Windows illa C:\ sürücüsüne mutlaka kurulması gerekir diye bir şart sözkonusu olamaz...
Anlattığım ChDir prosedürünü izah etmek amacıyla bir örnekti.
NeverFear yazdı:Bu kod, install ettiğiniz programınız...
sabanakman yazdı:...oluşturulan kısayoldan çalışan programın, başlama yeri değişik bir yol veya boşsa yararalanılabilinir...
Eğer kurulum ayarlarında oluşturduğun kısayol için başlama yeri olarak program klasörünün olduğu yere ayarlayabilirseniz böyle bir koda ihtiyacınız olmaz. Sanırım bu tür hataları kısayollardan çalışan program için alıyordunuz. Hangi kurulum programını kullanıyorsunuz bilmem ama (yine örnek olması açısından) inno setup ile oluşturulan kısa yollarda WorkingDir özelliğine {app}\ yazılırsa bu kodları kullanmaya gerek kalmaz.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

hangi sürücüde olursa olsun hata raporları ve program kırılmalarına neden olmadan çalışmasını sağlamak içindir.
İlginç, demek memory leak'leri de önleyebiliyor...
Çalıştırdığınızda gidip de C:\ sürücüsünü aramaz.
Delphi'de yeni boş bir proje oluşturun. Sonra derleyin ve çalıştırın. Emin olun siz demedikçe gidip c'yi felan aramaz. Windows zaten bir uygulamayı çalıştırdığında ilk parametre olarak bulunduğu klasörü yollar. Klasör yoksa programı nasıl çalıştırsın ki? Program isterse X sürücüsünde olsun, isterse ağ sürücüsünde. Çalıştığında ilk parametre olarak buradaki klasör gelir. Mantık olarak eğer klasör yoksa exe de yoktur. Sizin verdiğiniz kod çalışan exe'nin klasörüne ChDir ile girmeye çalışıyor ve yoksa MkDir ile yeniden oluşturuyor. Bunun hata raporları, program kırılmaları ve C sürücüsünü arama ile ilgili olduğunu zannetmiyorum.

Kolay gele.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

fatihtolgaata yazdı:...Windows zaten bir uygulamayı çalıştırdığında ilk parametre olarak bulunduğu klasörü yollar....
O program için oluşturulmuş kısa yoldan çalışan programlarda durum öyle değildir. Bir kısa yolu sağ tıklayıp özellikler diye kontrol ederseniz orada Başlama Yeri parametresi ne ise program o klasöre ChDir ile geçmiş gibi çalışır. Kurulum hazırlayanların en sık düştüğü hata da bu özelliğe gerektiği değeri vermemek. Böyle olunca da kısayoldan çalışan programlar (özellikle veri dosyalarına sahip uygulamalar) çok tuhaf hatalara düşebilmektedirler.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Sebep her ne olursa olsun, program içerisinden basit bir ExtractFilePath(Application.ExeName) veya ExtractFilePath(ParamStr(0)) eklemesini, her defasında loadfromfile vb. cümlelerine eklememek için bir çaba olarak görüyoruz.

- Koda dönersek, MkDir tarafına takıldım ben de. Çalışmakta olan programın dizini yok ise oluştur şeklinde bir yapı görüyorum. Yanlış mı anlamlandırıyorum bilemedim ama zaten program çalışıyorsa dizin de vardır. Dolayısı ile hata olmayacağı ve IOResult hiçbir zaman 0'dan farklı olamayacağına göre kontrol ne için onu anlamadım.

- Buradaki kod bloğunun yaptığı işi tek başına şu yapmaz mıydı ?

Kod: Tümünü seç

  ChDir(ExtractFilePath(Application.ExeName));
Resim
Resim ....Resim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

mrmarman yazdı:...MkDir tarafına takıldım ben de. Çalışmakta olan programın dizini yok ise oluştur şeklinde bir yapı görüyorum. Yanlış mı anlamlandırıyorum bilemedim ama zaten program çalışıyorsa dizin de vardır...
Hocam dikkatinden de hiç bir şey kaçmıyor :) . Her ne kadar if IOResult <> 0 then MkDir(PATH); satırı bir sorun çıkarmasa da aynen dediğiniz gibi mantık olarak bu satıra ihtiyaç yoktur.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

sabanakman yazdı:O program için oluşturulmuş kısa yoldan çalışan programlarda durum öyle değildir. Bir kısa yolu sağ tıklayıp özellikler diye kontrol ederseniz orada Başlama Yeri parametresi ne ise program o klasöre ChDir ile geçmiş gibi çalışır.
Şuan çok emin olduğum halde, sadece gidişat yolumu belirtmek için bir deneme yaptım. Masaüstümde bir exe dosyası mevcut :
"C:\Documents and Settings\fatih\Desktop\New Folder (2)"
Program Formun OnCreate olayında ParamStr(0) ve Application.ExeName değerlerini ShowMessage ile gösteriyor. Ardından bu exe'nin bir kısayolunu yaptım. Ve bunu bir başka yere kopyaladım. Kısayolun "Başlama Yeri"ni sildim. Sonuç değişmedi. "C:" yaptım sonuç değişmedi. Bu exe için bir install dosyası hazırladım, kurdum ve "Başlama Yeri"ni boş yaptım. Bilin bakalım ne oldu? Sonuç değişmedi!!
Kısayoldan da çalışsa çalışmasa da ilk parametre(yani sıfırıncı) daima exe'nin yolunu verir.
mrmarman yazdı:- Sebep her ne olursa olsun, program içerisinden basit bir ExtractFilePath(Application.ExeName) veya ExtractFilePath(ParamStr(0)) eklemesini, her defasında loadfromfile vb. cümlelerine eklememek için bir çaba olarak görüyoruz.
Eğer demek istediğiniz ikide bir bu kodları tekrar tekrar yazmamaksa, katılıyorum. Her yerden ulaşılabilecek bir değişkene bu değerleri atamak daha hesaplı olur. Hatta class helperlar ile Application sınıfına ExePath gibi bir özellik eklemek daha akıllıca olacaktır.

Kolay gele.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Anlatımımda bir hatam oldu galiba. ParamStr(0) hiç bir zaman değişmez zaten.

Dikkat çekmek istediğim nokta program tarafından kullanılan dosya isimlerinde yol belirtilmezse fark ortaya çıkacaktır.
Memo1.Lines.LoadFromFile('Yed.txt');
veya
ADOConnection1.ConnectionString:=Provider='Microsoft.Jet.OLEDB.4.0;Data Source=vt1.mdb;Persist Security Info=False';
gibi kodların denenmesinde anlatmaya çalıştığım hususlar ortaya çıkacaktır. Bu dosya isimlerinde yol ismi verilmediğinden .exe'nin çalışma klasörü neresi ise oraya bakacaktır. ChDir prosedürü veya kısayolda bulunan başlama yeri olarak belirtilen yer programın çalışma klasörüdür. Anlatmaya çalıştığım asıl konu exe'nin bulunduğu klasör ile çalıştığı klasör farklı olabilir. ExtractFilePath(ParamStr(0)); hiç bir zaman değişmez. Bu .exe'nin bulunduğu klasördür. GetCurrentDir; ise programın üzerinde çalıştığı klasörü verir ve ChDir ile bu program içinden değiştirilebilir. Program dosyalarla çalışırken dosya yolu belirtilmemişse çalışma klasörüne (GetCurrentDir) bakar ve bu konu bir çok defa gözden kaçtığı için makalede yazılan bahsi geçen hatalara sebep olabilmektedir. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

fatihtolgaata yazdı: Şuan çok emin olduğum halde, sadece gidişat yolumu belirtmek için bir deneme yaptım. Masaüstümde bir exe dosyası mevcut :
"C:\Documents and Settings\fatih\Desktop\New Folder (2)"
Program Formun OnCreate olayında ParamStr(0) ve Application.ExeName değerlerini ShowMessage ile gösteriyor. Ardından bu exe'nin bir kısayolunu yaptım. Ve bunu bir başka yere kopyaladım. Kısayolun "Başlama Yeri"ni sildim. Sonuç değişmedi. "C:" yaptım sonuç değişmedi. Bu exe için bir install dosyası hazırladım, kurdum ve "Başlama Yeri"ni boş yaptım. Bilin bakalım ne oldu? Sonuç değişmedi!!
Kısayoldan da çalışsa çalışmasa da ilk parametre(yani sıfırıncı) daima exe'nin yolunu verir.
Çok ilginçtir benimde anlayamadığım bir durum var,
Mesela bir StringList e diyorumki , LoadFromFile('denene.sql')
bana file not found diyor, ama LoadFromFile(ExtractFilePath(Application.ExeName)+'denene.sql') diyerek çağırıyorum dosyayı yüklüyor, aynı durum WinEXec ile farklı exeler çalıştıracağımız zamanda oluyor çıplak kullanınca bazen çalıştırmıyor ama Path le kullanınca hiç sorun çıkartmıyor.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

vkamadan yazdı:LoadFromFile(ExtractFilePath(Application.ExeName)+'denene.sql') diyerek çağırıyorum dosyayı yüklüyor, aynı durum WinEXec ile farklı exeler çalıştıracağımız zamanda oluyor çıplak kullanınca bazen çalıştırmıyor ama Path le kullanınca hiç sorun çıkartmıyor.
Evet haklısınız. Bu tarz işlemlerde eğer aktüel yol verilmezse, Windows'daki "Enviroment Variables" değerlerine göre dosya aranır. Bulunamadığında da hatayı basar. Sistem özelliklerinde gelişmiş kısmında mevcut ama Türkçesi nasıldır bilemiyorum. Aynı şeyi konsoldan PATH yazarak da çıkartabilirsiniz. Bu yüzden ya programımızn yolunu bu PATH kısmına ekleyecez ki tavsiye edilmez, ya da Exe'nin yolunu kod içinde kendimiz belirteceğiz.
Cevapla