Birden fazla TXT dosyası nasıl seçilebilir?

russianrapper

Hectopat
Katılım
9 Nisan 2017
Mesajlar
83
Daha fazla  
Cinsiyet
Erkek
Herkese iyi forumlar dilerim. Bir proje üzerinde çalışıyorum fakat projenin başından beri takıldığım bir problem var. Öncelikle programın çalışma mantığını anlatayım.

Program metin dosyasını açıyor ve içerisinde birden fazla satıra yazılmış yazılar var. Ben bunların her birini tek tek seçip açarak içindeki metinleri, form içinde bulunan listview'e çekiyorum. Buraya kadar hiçbir sorun yok.

Sizden yardım istediğim konu ise şu; metin dosyalarını tek tek seçmek zaman kaybettiriyor, bu dosyaların hepsini (yaklaşık 1000 tane) nasıl aynı anda seçerek aynı anda listview'e yazdırabilirim?

Şöyle düşünün; 3 adet metin dosyası var, bunları tek tek seçip işlemek yerine CTRL+A ile hepsini seçip tek seferde işleme sokmak istiyorum.

Proje hakkınca daha fazla bilgi sahibi olmanız için aşağıda bazı bilgileri paylaşacağım.

Proje C# form uygulamasıdır.
En başta using System.IO'yu ekliyorum.
OpenFileDialog ile dosyayı açıyorum.
MultiSelect özelliği true.

Birden fazla dosya seçiliyor fakat aynı anda yazdırılamıyor. Yani bu seçilen metin dosyalarının tek tek bir diziye atanması, orada yedekte durması ve hepsinin sırayla okunup listview'e aktarılması lazım. Sonuç olarak TXT dosyasını bir diziye atamam gerekiyor ama böyle bir dizi türü yok.

Ne gibi bir çözüm önerirsiniz?
 
C#:
 DialogResult dr = this.openFileDialog1.ShowDialog();
    if (dr == System.Windows.Forms.DialogResult.OK)
    {
        
        foreach (String file in openFileDialog1.FileNames)
        {
            //Burada ne yapacağın sana kalmış.
        }
    }
 
C#:
 DialogResult dr = this.openFileDialog1.ShowDialog();
    if (dr == System.Windows.Forms.DialogResult.OK)
    {
       
        foreach (String file in openFileDialog1.FileNames)
        {
            //Burada ne yapacağın sana kalmış.
        }
    }
Dostum bu kısmı ben de biliyorum fakat asıl mesele şu; metin dosyalarını aynı anda seçemiyorum, hepsini aynı anda yazdıramıyorum. Sonuç olarak metin dosyalarını nasıl bir diziye atayabileceğim lazım.
 
Dostum bu kısmı ben de biliyorum fakat asıl mesele şu; metin dosyalarını aynı anda seçemiyorum, hepsini aynı anda yazdıramıyorum. Sonuç olarak metin dosyalarını nasıl bir diziye atayabileceğim lazım.

Konuda birden fazla dosya seçebiliyorum diyorsun, şimdi de seçemiyorum diyorsun. Ancak multi select ile seçebiliyor olman gerekiyor. Aşağıda vereceğim örnekte bunun üzerinden gidiyorum.

Tam olarak bunu mu istiyorsun anlamadım ama KeyValuePair kullanarak yapabilirsin gibi geliyor.
Hem dosya adını hem dosya içeriğini tutabilirsin böylece.


C#:
var fileNameAndFile = new List<KeyValuePair<string, string>>();
DialogResult dr = this.openFileDialog1.ShowDialog();
    if (dr == System.Windows.Forms.DialogResult.OK)
    {
        foreach (String fileName in openFileDialog1.FileNames)
        {   
            string fileContent = File.ReadAllText(fileName);   
            fileNameAndFile.Add(new KeyValuePair<string, string>(fileName, fileContent));
            
        }
    }
 
Konuda birden fazla dosya seçebiliyorum diyorsun, şimdi de seçemiyorum diyorsun. Ancak multi select ile seçebiliyor olman gerekiyor. Aşağıda vereceğim örnekte bunun üzerinden gidiyorum.

Tam olarak bunu mu istiyorsun anlamadım ama KeyValuePair kullanarak yapabilirsin gibi geliyor.
Hem dosya adını hem dosya içeriğini tutabilirsin böylece.


C#:
var fileNameAndFile = new List<KeyValuePair<string, string>>();
DialogResult dr = this.openFileDialog1.ShowDialog();
    if (dr == System.Windows.Forms.DialogResult.OK)
    {
        foreach (String fileName in openFileDialog1.FileNames)
        {
            string fileContent = File.ReadAllText(fileName);
            fileNameAndFile.Add(new KeyValuePair<string, string>(fileName, fileContent));
         
        }
    }
Çoklu seçiyorum ama dosyaları çek dediğimde en baştakini çekiyor. Yazdığın kodları deneyeceğim fakat C# olduğunu hatırlatayım. Var değişkenini string mi yapmalıyım?

Ve kodu projeye nasıl dahil edeceğimi çözemedim. Burada yazan kodlar ne işe yarıyor? Desteğin için teşekkürler bu arada.
 
Son düzenleme:
Çoklu seçiyorum ama dosyaları çek dediğimde en baştakini çekiyor. Yazdığın kodları deneyeceğim fakat C# olduğunu hatırlatayım. Var değişkenini string mi yapmalıyım?

Ve kodu projeye nasıl dahil edeceğimi çözemedim. Burada yazan kodlar ne işe yarıyor? Desteğin için teşekkürler bu arada.

C#'da var kullanabilirsin. Ancak onun yerine şöyle de tanımlayabilirsin.

C#:
List<KeyValuePair<string, string>> fileNameAndFile = new List<KeyValuePair<string, string>>();

Gereken kısımları dahil edeceksin. Komple alıp bir yere koyamazsın. KeyValuePair ile hem dosya adını key olarak, dosya içeriğini de value olarak tutabiliyorsun. Key ile valueye erişim sağlanabiliyor. 2 boyutlu dizi gibi ama daha avantajlı.

Yani kısacası dosya içeriklerini sırayla okuyup, sıralı bir şekilde (dosya adı, dosya içeriği) şeklinde bir listede tutuyor.

Bu arada sadece en baştakini seçmemesi lazım. Orada bir şey var ve muhtemelen gözünden kaçıyor.

Örneğin aşağıdaki kısımda sonda FileNames yerine FileName yazmış olabilirsin. Eğer öyle ise sadece ilki gelir.

C#:
foreach (String fileName in openFileDialog1.FileNames)
 
Ben ne yapmaya calistigini tam anlayamadim.
"Birden fazla dosya seçiliyor fakat aynı anda yazdırılamıyor. " demissin. Ayni anda yazdirilmasindan kastin nedir tam olarak? Multithread mi yapmak istiyorsun?

A dosyasinda:
- A1
- A2
- A3
B dosyasinda:
- B1
- B2
- B3

yaziyor diyelim sirasiyla her satirda. Elde etmeye calistigin sonuc:

- A1
- B1
- A2
- B2
- A3
- B3

gibi bir liste elde etmek mi?

Yani bu seçilen metin dosyalarının tek tek bir diziye atanması, orada yedekte durması ve hepsinin sırayla okunup listview'e aktarılması lazım.

Metin dosyasini diziye atamak nedir tam olarak? Yedekte durmaktan kastettigin nedir? Sirayla olmasindan kastin, listede once 1. dosyadan gelenlerin yazilmasi midir?
 
Cevaplarınız için her ikinize de teşekkür ederim. Programın çalışma mantığını en baştan anlatayım.
Çekmekle uğraştığım metin dosyalarının içindeki metinler şu şekilde oluyor:
MODE 0 (oyun modunu belirleyen kod)
SIZE 11/70 (oyunun uzunluğunu belirleyen kod)
LIMIT 0/12 (atış hakkını belirleyen kod)
COLOR LIMIT 3 (oyunda kullanılan topların renklerinin sınırını belirleyen kod)
STARS 400/9000/13000 (kaç puanda kaç yıldız alınacağını belirleyen kod)
(buradan aşağıdaki sayılar oyunun dizaynını belirliyor, bu aşamada onların konumuz ile ilgisi yok)
3 0 0 0 0
5 5 1 1 3 3 3 1 1 5 5
5 1 1 3 3 3 3 1 1 5 0
0 5 5 1 3 3 3 1 5 5 0
0 5 1 3 3 3 3 1 5 0 0
0 0 1 1 3 3 3 1 1 0 0
0 0 1 1 3 3 1 1 0 0 0
0 0 0 1 1 3 1 1 0 0 0

Programın amacı; metin dosyalarının içinde bulunan belirli satırlardaki (kalın yazılar ile belirttim) verileri çekmek ve bunların hepsini bir listview'e yazdırmak (Listview'e direkt olarak yazdıramıyorum çünkü bu metin dosyasını önce bir textbox'a yazdırmam ve textbox'ın içindeki yazıları incelemem ve yukarıda belirttiğim satırlardaki verileri alıp listview'in ayrı ayrı sütunlarına eklemem gerekiyor. Yani işlem yapılabilmesi için textbox'a yazdırmam gerekiyor. Asıl mesele de burada işte. Metin dosyasındaki verileri doğrudan listview'e çekmeyip textbox'a yazdırdığım için multiselect özelliği ile çoklu seçim yapsam bile dosyaları al tuşuna basınca textbox'a sadece ilk seçilen level'ın verileri yazdırılıyor, doğal olarak listview'e de sadece o an textbox'da bulunan level'ın verileri yazdırılıyor.) ve sonuç olarak işlem bittiğinde bu listview'deki verileri sütunlara belli isimlerle tekrardan metin dosyalarına kaydetmek. İşlem bittiğinde en son elde ettiğim veriler şu şekilde oluyor:

"Level" isimli metin dosyasının içinde yazanlar:
1
2
3

"Oyun Modu" isimli metin dosyasının içinde yazanlar:
Yumurtalara Ulaş
Yumurtalara Ulaş
Yumurtalara Ulaş

"Atış Hakkı" isimli metin dosyasının içinde yazanlar:
12 top
13 top
12 top

"Yıldızlar" isimli metin dosyasının içinde yazanlar:
400/9000/13000
400/9000/14000
400/7000/9000

Sonuç olarak sizden nasıl bir kod dizini istediğimi tekrar belirteyim.
Örneğin; 3 metin dosyasını seçtim ve "dosyaları al" tuşuna bastım. Bu aşamadan sonra seçtiğim bu 3 level'ın hepinin bir dizide ya da bir alanda bekletilmesi ve en baştan teker teker textbox'a yazdırılması geriyor. Zaten teker teker textbox'a yazdırıldığında doğal olarak listview'e veriler eklenecek. Tek gerek şey, seçilen metin dosyalarının art arda textbox'a yazdırılması.
@bitwise @Sinful
 
Son düzenleme:
Anladığım kadarıyla her metin için ayrı textbox oluşturmalısın. Yani foreach her dönüşünde yeni ve farklı isimde bir textbox oluşturmalı. Visible özelliklerini de kapatırsan görüntüsü problem olmaz.
 
Uyarı! Bu konu 5 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.

Geri
Yukarı