C# WPF Procress.Start Satırında Fırlatma

Hello

Hectopat
Katılım
2 Temmuz 2014
Mesajlar
555
Makaleler
2
Daha fazla  
Cinsiyet
Erkek
Merhaba bugün @Fatih Apaydın hocamdan kod aldım ilk başta hata yoktu ama resim, müzik, metin belgesi gibi şeyleri çalıştırmayı denediğimde kod kırılıyor. Sorun galiba Procress.Start komutu dosya yolu istediği için oluyor. Nasıl tüm dosyaları açar hale getirebilirim ? @Fatih Apaydın yine işimiz düştü size :).
Kod:
    private void listbox1_MouseDoubleClick_1(object sender, MouseButtonEventArgs e)
        {
            var secilenDosya = listbox1.SelectedItem as string;



            if (secilenDosya != null)
            {
                System.Diagnostics.Process.Start(secilenDosya);
            }
          
            {
              
            }
        }
 
Merhabalar, Bende bazen Windows Media Player'ın o meşhur "sunucu hatası" mesajı dışında sorun gözükmüyor. Bu basit uygulama her türlü metin dosyasını, resmi, müzik dosyasını v.s. açabiliyor.
Çözümün WPF versiyonu aşağıda. İnceleyip kendi çözümünüzle bir karşılaştırın lütfen. Keşke en başta WPF çözümü yazsaydım. Daha iyi olacaktı.

Öncelikle XAML tasarım kodu:

Kod:
<Window x:Class="WpfDosyaCalistirma.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_Loaded" Closing="Window_Closing">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
          
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>      
        </Grid.ColumnDefinitions>
  
        <Button x:Name="btnDosyaEkle" Grid.Row="0" Grid.Column="1"  Content="Dosya Ekle..." Click="btnDosyaEkle_Click"/>
  
        <ListBox x:Name="listBox1" Grid.Row="1" Grid.ColumnSpan="3" MouseDoubleClick="listBox1_MouseDoubleClick"/>
  
        <Button x:Name="btnCalistir" Grid.Row="2" Grid.Column="1" Content="Seçilen Dosyayı Çalıştır" Click="btnCalistir_Click"/>
    </Grid>
</Window>

C# kodu:
Kod:
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml.Serialization;

namespace WpfDosyaCalistirma
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        string kaydedilecekDosyaYolu = System.AppDomain.CurrentDomain.BaseDirectory + "\\dosyaAdlari.xml";

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                //Uygulamadan çıkarken kaydettiğimiz dosya adlarını listboxa ekleyelim
                List<string> dosyaAdlari = new List<string>();

                using (System.IO.StreamReader okuyucu = new System.IO.StreamReader(kaydedilecekDosyaYolu))
                {
                    XmlSerializer deSerilestirici = new XmlSerializer(typeof(List<string>));
                    dosyaAdlari = (List<string>)deSerilestirici.Deserialize(okuyucu);
                }

                for (int i = 0; i < dosyaAdlari.Count; i++)
                {
                    listBox1.Items.Add(dosyaAdlari[i]);
                }         
            }
            catch
            {

            }
        }


        private void btnDosyaEkle_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog yeniDialog = new OpenFileDialog();

            if (yeniDialog.ShowDialog().Value == true)
            {
                if (!String.IsNullOrWhiteSpace(yeniDialog.FileName))
                {
                    listBox1.Items.Add(yeniDialog.FileName);
                }
            }
        }

        private void btnCalistir_Click(object sender, RoutedEventArgs e)
        {
            var secilenDosya = listBox1.SelectedItem as string;

            if (secilenDosya != null)
            {
                try
                {
                    System.Diagnostics.Process.Start(secilenDosya);
                }
                catch
                {
                    MessageBox.Show("Dosya çalıştırılırken bir hata oluştu.\nDosyayı yeniden çalıştırmayı deneyiniz.");
                }
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            //listboxdaki tüm dosya adlarını kaydetmek için almalıyız.

            List<string> dosyaAdlari = new List<string>();     

            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                dosyaAdlari.Add(listBox1.Items[i].ToString());
            }

            //Çıkışta dosyaları xmle kaydedelim
            using (System.IO.StreamWriter yazici = new System.IO.StreamWriter(kaydedilecekDosyaYolu))
            {
                XmlSerializer serilestirici = new XmlSerializer(typeof(List<string>));
                serilestirici.Serialize(yazici, dosyaAdlari);
            }
        }

        private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            var secilenDosya = listBox1.SelectedItem as string;

            if (secilenDosya != null)
            {
                try
                {
                    System.Diagnostics.Process.Start(secilenDosya);
                }
                catch
                {
                    MessageBox.Show("Dosya çalıştırılırken bir hata oluştu.\nDosyayı yeniden çalıştırmayı deneyiniz.");
                }
            }
        }

  
    }
}
 
Son düzenleme:
@Fatih Apaydın kod gerektiği gibi çalıştı ancak bir sorum olucak. Koddaki eksiklik neden dolayı ki resim, müzik gibi dosyaları açamıyor ? Ayrıca size ulaşacağım sosyal medya araçlarını kullanıyorsanız benimle paylaşabilir misiniz ?

@Fatih Apaydın sizi de uğraştırıyorum ancak önceki kod .exe dosyalarını açıyordu. Bu hiçbir şeyi açmıyor.
 
Kodu sizlerle paylaşmadan önce mutlaka çalışıp çalışmadığının kontrolü hususunda oldukça özen gösterdiğimi söyleyebilirim.

Sizin önceki forum konularında withoutextension isimli bir metot dikkatimi çekmişti. Sanırım sıkıntı o metodu kullandığınızdan dosya uzantılarının listboxa eklenen dosya adında yer almaması. Mesela C:\deneme\belge.txt dosya adı yerine listboxda dosya adı olarak C:\deneme\belge yer alıyor. Kodunuzu paylaşın bir bakayım ben. Özellikle sürükle bırak kısmını.
 
Yanılmıyorsam buradaki withoutextension kodundan bahsediyorsunuz.
Kod:
        private void listbox1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effects = DragDropEffects.All;
            else
                e.Effects = DragDropEffects.None;

        }

        private void listbox1_Drop(object sender, DragEventArgs e)
        {
            string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            int i;

            for (i = 0; i < s.Length; i++)
                listbox1.Items.Add(s[i]);



            for (i = 0; i < s.Length; i++)
                listbox1.Items.Add(System.IO.Path.GetFileNameWithoutExtension(s[i]));

            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
              

            }
        }





         
          
    }
 
Tahmin ettiğim gibi :) Maalesef sosyal medyayı kullanmıyorum. Bu aralar biraz yoğun olsam da sık sık forumu ziyaret ediyorum.
Kod:
//Listboxın xaml kodunda AllowDrop="True" ataması çok önemli false kalırsa dosyayı listboxa bırakamazsınız.
<ListBox x:Name="listBox1" Grid.Row="1" Grid.ColumnSpan="3" MouseDoubleClick="listBox1_MouseDoubleClick"
    DragEnter="listBox1_DragEnter" Drop="listBox1_Drop"  AllowDrop="True"/>


//Bu metotta sıkıntı gözükmüyor.
private void listBox1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effects = DragDropEffects.All;
            else
                e.Effects = DragDropEffects.None;
        }


    //Sıkıntı bu listbox olay metodunda
        private void listBox1_Drop(object sender, DragEventArgs e)
        {
            //Aşağıdaki 4 satır kod dosya adı almak için yeterli yorum satırı yaptığım diğer kod satırlarına gerek yok
            string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            int i;
            for (i = 0; i < s.Length; i++)
                listBox1.Items.Add(s[i]);



            //for (i = 0; i < s.Length; i++)
            //    listBox1.Items.Add(System.IO.Path.GetFileNameWithoutExtension(s[i]));

            //if (e.Data.GetDataPresent(DataFormats.FileDrop))
            //{


            //}
        }
 
@Fatih Apaydın hocam aslında ben drag-drop'dan ümidi kesmiştim yapılamıyor diye. Ama siz paylaşınca drag-drop yapsammı bilemedim. Ama diğer openFileDialog ile yapmak daha iyi. Ancak halen daha altaki kod satırında hata vermekte, genellikle çoğu dosyayıda açmıyor. Sizi aşırı işinizden alı koyuyorum, bu yüzden özür dilerim. Kod satırında ki hatayı çözmem gerek çünkü yeni sürümünü çıkaracağım programa eklemem gerek ama haftaya kadar acelesi yok. Sizin bilgisayarınızda çalışıyor ama bende direkt olarak kodu aldığım halde açmıyor dosyaları nasıl oluyor bu hiç anlamıyorum. Vicdanım sizi aşırı uğraştırdığımı söylüyor bu konuda yine özür dilerim. Direkt olarak verdiğiniz kodlar ;
Kod:
  string kaydedilecekDosyaYolu = System.AppDomain.CurrentDomain.BaseDirectory + "\\dosyaAdlari.xml";




        private void btnOpen_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog yeniDialog = new OpenFileDialog();

            if (yeniDialog.ShowDialog().Value == true)
            {
                if (!String.IsNullOrWhiteSpace(yeniDialog.FileName))
                {
                    listbox1.Items.Add(yeniDialog.FileName);
                }
            }
        }









        private void btnRemove_Click_1(object sender, RoutedEventArgs e)
        {
            listbox1.Items.Remove(listbox1.SelectedItem);
        }



        private void main1_Closing_1(object sender, System.ComponentModel.CancelEventArgs e)
        {
            //listboxdaki tüm dosya adlarını kaydetmek için almalıyız.

            List<string> dosyaAdlari = new List<string>();

            for (int i = 0; i < listbox1.Items.Count; i++)
            {
                dosyaAdlari.Add(listbox1.Items[i].ToString());
            }

            //Çıkışta dosyaları xmle kaydedelim
            using (System.IO.StreamWriter yazici = new System.IO.StreamWriter(kaydedilecekDosyaYolu))
            {
                XmlSerializer serilestirici = new XmlSerializer(typeof(List<string>));
                serilestirici.Serialize(yazici, dosyaAdlari);
            }
        }

        private void main1_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                //Uygulamadan çıkarken kaydettiğimiz dosya adlarını listboxa ekleyelim
                List<string> dosyaAdlari = new List<string>();

                using (System.IO.StreamReader okuyucu = new System.IO.StreamReader(kaydedilecekDosyaYolu))
                {
                    XmlSerializer deSerilestirici = new XmlSerializer(typeof(List<string>));
                    dosyaAdlari = (List<string>)deSerilestirici.Deserialize(okuyucu);
                }

                for (int i = 0; i < dosyaAdlari.Count; i++)
                {
                    listbox1.Items.Add(dosyaAdlari[i]);
                }
            }
            catch//Kaydettiğimiz dosya yoksa sessizce hatayı fırlat. Boş bir listbox demek bu
            {

            }
        }

        private void listbox1_MouseDoubleClick_1(object sender, MouseButtonEventArgs e)
        {
            var secilenDosya = listbox1.SelectedItem as string;

            if (secilenDosya != null)
            {
                try
                {
                    System.Diagnostics.Process.Start(secilenDosya);
                }
                catch
                {
                    MessageBox.Show("Dosya çalıştırılırken bir hata oluştu.\nDosyanın .");

                }
            }
        }


    }
}
 
Son paylaştığınız kodda olay isimleri biraz şüpheli. Mesela btnRemoveun click olayının adı neden btnRemove_Click değilde btnRemove_Click_1 ? btnRemoveun xamlında click= ne yazıyor? Eğer btnRemove_Click_1 yazmıyorsa düzeltin. Ayrıca main1_Closing_1 , listbox1_MouseDoubleClick_1 gibi olayların adlarınıda kontrol edin.

Eğer kod hala çalışmamakta ısrar ediyorsa ilk paylaştığım wpf koduna yeni konuştuğumuz sürükle bırak iki olay metodunu da ilave edip temiz bir proje üzerinde çalışın.

Birde Youtube da Visual Studio ile debug yapmayı öğreten kaliteli bir eğitim videosunu izlemenizi hararetle tavsiye ederim. Zor bir şey olmayan debug yapmayı öğrenerek kodun hangi aşamalardan geçtiğini kolayca görüp kodunuza yapmanız gereken müdahaleye daha kolay karar verebilirsiniz. Youtube da aratmanız gereken kelime Visual Studio ile debug veya how to debug with Visual Studio.
 
Adsız.png
btnRemove kısmında bir sorun yok, litbox'a eklenen itemleri siliyor. Kod çalışıyor debug yaparkende hata filan vermiyor ama seçilen dosyayı açmamakta kararlı şuan için. Drag-Drop işlemini ekleyip denedim ama yine Procress.Start'da hatayı veriyor. Güsterdiğiniz 4 satır kodu silince listbox'a item sürüklenmiyor AllowDrop özelliğini true yaptığım halde. Şuan siyah alan ile gösterdiğim yere tıklayınca çalşıyor her program için. Sorun çözüldü ama çok ufacık bir sorun var :), oradaki dosya yolunu , dosyanın adını yazdırsak sorun olur mu ? Çünkü direk dosyanın adına tıklayınca kod fırlatıyor.
 
Son düzenleme:
Listboxda klasör ismi var bir dosya adı değil. Process.Start, c:\deneme\ gibi bir şey yerine c:\deneme\belge.txt gibi bir dosya adı bekliyor.

Paylaştığım kod sürükle bırak da dahil olmak üzere çalışıyor. Hatta iki exe dosyayı sürükleyip listboxa bıraktım dosya uzantıları ile birlikte tam yol dosya adı+uzantı listede gözüktüler. Sonrada çift tıklayınca exe dosyası çalıştı.

En iyisi temiz bir proje ile başlayıp adım adım ilerleyin. Ayrıca F9 a basıp kodun bir yerine break point koyarak debug yapabiliyor olmanıza sevindim.
 
Uyarı! Bu konu 9 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Yeni konular

Geri
Yukarı