2010-12-08 17 views
9

Çok sayıda dosya üzerinde yinelemek ve belirli bir dizgi eşleşmesinin bulunduğu bazı değişiklikleri uygulamak için küçük bir program yazdım. dosyalar farklı kodlamalara sahiptir. Yani yapmak istediğim kodlamayı kontrol etmek, daha sonra dosyanın orijinal kodlamasıyla üzerine yazmak.C# - Bir dosyada kodlamayı tespit ederek, bulunan kodlamayı kullanarak dosyaya yazma yazınız

C# .net 2.0'da bunu yapmanın en güzel yolu ne olurdu?

Kodum bugün itibariyle çok basit görünüyor

;

String f1 = File.ReadAllText(fileList[i]).ToLower(); 

if (f1.Contains(oPath)) 
{ 
    f1 = f1.Replace(oPath, nPath); 
    File.WriteAllText(fileList[i], f1, Encoding.Unicode); 
} 

Beni, kodlamayı tespit nasıl anlamamı sağladı Auto encoding detect in C# bir göz attım, ama ben aynı kodlamada yazmak için bu bilgileri kullanabilirsiniz nasıl emin değilim.

Burada herhangi bir yardım için çok teşekkür ederim. Korkarım

+1

kaldırır Oku Bu http://www.joelonsoftware.com/articles/Unicode.html – RvdK

cevap

15

Maalesef kodlama her zaman kesin bir cevabı yoktur bu konulardan biridir. Çoğu durumda, kodlamanın saptanmasına karşıt olarak tahmin edilmesi çok daha yakındır. Raymond Chen BOM (bayt sırası işareti) mevcutsa, o değer bu konuda mükemmel bir blog yazısı

makalenin özü

Yine de en iyi yaklaşımın, bağlantılı olduğunuz sorudaki Darin'e olduğunu düşünüyorum. Tekerleği yeniden icat etmek için StreamReader'un sizin için tahmin etmesine izin verin. Sadece örneğinizde çok az değişiklik gerektirir.

String f1; 
Encoding encoding; 
using (var reader = new StreamReader(fileList[i])) { 
    f1 = reader.ReadToEnd().ToLower(); 
    encoding = reader.CurrentEncoding; 
} 

if (f1.Contains(oPath)) 
{ 
    f1 = f1.Replace(oPath, nPath); 
    File.WriteAllText(fileList[i], f1, encoding); 
} 
+0

Ahh, Sadece hayati bir şey öğrendim, bunun için teşekkürler. İyi cevap. – cc0

+1

Okuyucu geri yazmadan önce atmanız gerekecek mi? –

+0

@Dog Kulaklar, iyi yakalayın. Sabit – JaredPar

1

, sen kodlama bilmek gerekir. Ancak, UTF tabanlı kodlamalar için StreamReader işlevinde yerleşik olarak kullanabilirsiniz.

Alınan form here. kodlamaları ile ilgili olarak

- Şunu gerek StreamReader kullanmak için kodlamayı belirledik etmek.

Ancak StreamReader kendisi (veya Encoding.GetPreamble kullanabilir ve bakabilirsiniz sen gerçek olarak flag detectEncodingFromByteOrderMarks tedarik sağlar yapıcı aşırı biriyle yardım oluşturmak eğer bayt kendini hazırla). böylece herhangi ANSI kodlamaları muhtemelen doğru ayrıştırılır olmayacak belirli bir kod sayfasıyla -

her iki metod sadece olsa UTF bazlı kodlamaları otomatik algılama yardımcı olacaktır.

+0

Çok bilgilendirici, teşekkür ederim. – cc0

2

Varsayılan olarak, Net. UTF8 kullanın.Çoğu zaman karakter kodlamasını tespit etmek zordur. Net UTF8 olarak okunur. Ben ANSI ile problemim var.

benim sırrım ben gibi UTF8 okuyup metinde olmalıdır zamanki karakterini tespit etmek güç olarak Aktarımı olarak dosyayı okuyacak olduğunu. Eğer bulunursa, UTF8 else ANSI ... ve kullanıcıya sadece 2 kodlamasını ANSI veya UTF8 kullanabilir. otomatik dectect dilimde çok çalışmaz: p

+0

Anlayışınız, içgörü için teşekkür ederim:] – cc0

+0

Çoğu durumda, kodlama metin dosyaları için veya Varsayılan (Windows) veya UTF8 için iyi öneriler. – dlopezgonzalez

0

Biraz geç kaldım ama aynı sorunla karşılaştım, önceki cevapları kullanarak benim için çalışan bir çözüm buldum, StreamReaders öntanımlı kodları kullanarak metni okur Bu dosyada kullanılan kodlama ve bulunan Encoding kullanarak değişiklikleri geri yazmak için StreamWriter kullanır. Ayrıca \ reAdds SaltOkunur bayrağı

 string file = "File to open"; 
     string text; 
     Encoding encoding; 
     string oldValue = "string to be replaced"; 
     string replacementValue = "New string"; 

     var attributes = File.GetAttributes(file); 
     File.SetAttributes(file, attributes & ~FileAttributes.ReadOnly); 

     using (StreamReader reader = new StreamReader(file, Encoding.Default)) 
     { 
      text = reader.ReadToEnd(); 
      encoding = reader.CurrentEncoding; 
      reader.Close(); 
     } 

     bool changedValue = false; 
     if (text.Contains(oldValue)) 
     { 
      text = text.Replace(oldValue, replacementValue); 
      changedValue = true; 
     } 

     if (changedValue) 
     { 
      using (StreamWriter write = new StreamWriter(file, false, encoding)) 
      { 
       write.Write(text.ToString()); 
       write.Close(); 
      } 
      File.SetAttributes(file, attributes | FileAttributes.ReadOnly); 
     } 
İlgili konular