2016-03-23 15 views
0

Bir test yapmak isterdim. Benim sorum, hem okuma hem de yazma için dosya açmak mümkün mü, bu yüzden eğer bir dosya üzerinde daha fazla okuma-yazma işlemine sahip olsam, okuma durumunu kapatmam gerekmiyor, okuma, yazma durumu için aç, yazma ve böylece bir döngüde.Okuma durumunu kapatmadan dosyaya yazmak mümkün mü? PHP

$filename = "test.txt"; 
$handle = fopen($filename, "rwb"); 
fseek($handle , 15360); 
$contents = fread($handle, 51200); 

$start = microtime (true); 
fseek($handle , 1); 
fwrite ($handle , $contents); 
fclose($handle); 

Bu test çalışmıyor. Bekledim, verileri okuyacağım ve fseek işaretçisini dosyaya 1 ya da 0 pozisyonuna başlayacağım ve sonra veriyi yazacağım. Ancak bu eylem, bir sonucu için 0 (int) bayt yazılan bir sonuçla başarısız oldu. Dolayısıyla benim sorum şu, bunu yapmak mümkün mü? Ya da ilk önce dosyayı okumak için kapatmam gerek?

ile ilgili alt soru - daha fazla kullanıcının farklı konumlardan eşzamanlı olarak dosyaları okuyabilir veya yazabilir. Bu, veritabanı okuma/yazma işlemlerini simüle etmelidir. Mysql'in nasıl çalıştığını biliyorsunuz - daha fazla kullanıcı aynı tabloyu yazabilir - her zaman aynı dosya. Bunun C/C++ 'da sorun olmadığını biliyorum, ancak php'de yapmak mümkün mü?

+0

ile kilidi kaydı yaptırmanız gerekmektedir os bağlıdır ve dosyayı açtı, ancak birden fazla kullanıcı genellikle nasıl Aynı dosyayı açabilir, ancak bu kullanıcıların her birinin ne yaptığına bağlı olarak sonuçlar tanımlanmayacaktır. İşlem sırasına göre bir garanti yok. fread'in() başarılı olduğuna emin misin? fwrite hataya boolean FALSE döndürür. 0 döndürüyor, 0 bayt yazıyor demektir, yani $ içeriği boş demektir. –

+0

$ içeriğini görüntüleyebilirim ve evet, veriler başarıyla okunuyor. Operasyonların sırası, kullanıcı kimliği, örn. 09 no'lu kullanıcı 9 * 1024. bayttan başlayarak 1024bayt yazacak, 100 numaralı kullanıcı 100 * 1024 bayttan başlayarak 1024 bayt yazacaktır. –

cevap

1

Aynı dosyada birden fazla dosya tanıtıcısı oluşturabilirsiniz. Sadece fopen() iki kez, biri salt okunur, diğeri okuma/yazma ile. Dosyada iki farklı noktadan okuma ve yazmadığınız sürece neden bunu yapmak istediğinizden emin değilim.

$filename = "test.txt"; 
$rw_handle = fopen($filename, "c+"); //open for read/write, allow fseek 
$r_handle = fopen($filename, "r"); 

okumakta ve farklı yerlerde bir dosya yazma çoklu süreçleri sahip olmak istiyorsanız, flock()

+0

Bu iyi bir ipucu. Denedim: '$ filename =" test.txt "; $ handle_rb = fopen ($ filename, "rb"); $ handle_wb = fopen ($ filename, "wb"); fseek ($ handle_rb, 15360); $ content = fread ($ handle_rb, 51200); $ start = microtime (true); fseek ($ handle_wb, 1); fwrite ($ handle_wb, $ content); fclose ($ handle_rb); fclose ($ handle_wb); 'Ancak sonuçta dosyanın içeriği silinmiş. Nasıl düzeltebiliriz? Görmek istediğim, dosyanın sonundan 50 kb'lik içeriğin dosyanın başlangıcında kopyalanacağı ve dosyanın kalıntısının dokunulmamış olarak kaldığıdır. İşletim Sistemi Win XP –

+0

Eklemek için okuma/yazma işlemini açmanız gerekir; Kodumu günceller. – Ray

+0

'a +' \t ile ilgili sorun: "Okuma ve yazma için açık; ** Dosya işaretçisini dosyanın sonuna yerleştirin. ** Dosya yoksa, oluşturmayı deneyin. Bu modda, fseek () sadece okuma pozisyonunu etkiler, ** yazılar her zaman eklenir **. Sonunda baştan yazılan verilerle bitiriyorum. W + okuma/yazma içindir ama dosyayı kırpır ve boş dosya ile bitiririm ... –

İlgili konular