İngilizce dilinde oku

Aracılığıyla paylaş


Dosya Oluşturma ve Açma

CreateFile işlevi yeni bir dosya oluşturabilir veya var olan bir dosyayı açabilir. Dosya adını, oluşturma yönergelerini ve diğer öznitelikleri belirtmelisiniz. Bir uygulama yeni bir dosya oluşturduğunda, işletim sistemi bunu belirtilen dizine ekler.

İşletim sistemi, CreateFilekullanılarak açılan veya oluşturulan her dosyayatanıtıcısı olarak adlandırılan benzersiz bir tanımlayıcı atar. Bir uygulama bu tanıtıcıyı dosyayı okuma, yazma ve açıklama işlevleriyle kullanabilir. Bu tanıtıcıya yapılan tüm referanslar kapatılana kadar geçerlidir. Bir uygulama başlatıldığında, eğer tanıtıcılar devralınabilir olarak oluşturulmuşsa, uygulamayı başlatan işlemden tüm açık tanıtıcıları devralır.

Bir uygulama, dosyaya erişmek için tanıtıcıyı kullanmaya çalışmadan önce CreateFile tarafından döndürülen tanıtıcının değerini denetlemelidir. Hata oluşursa, tanıtıcı değeri INVALID_HANDLE_VALUE olur ve genişletilmiş hata bilgileri için uygulama GetLastError işlevini kullanabilir.

Bir uygulama CreateFilekullandığında, dosyadan okuma, dosyaya yazma, hem okuma hem de yazma ya da hiçbirinin amacını belirtmek için dwDesiredAccess parametresini kullanmalıdır. Bu, erişim moduistemek olarak bilinir. Uygulamanın,oluşturma eğilimi olarak bilinen dosya zaten varsa hangi eylemin gerçekleştirileceğini belirtmek için dwCreationDisposition parametresini de kullanması gerekir. Örneğin, bir uygulama, CreateFile fonksiyonunu çağırabilir ve dwCreationDisposition parametresi, aynı isimli bir dosya mevcut olsa bile her zaman yeni bir dosya oluşturacak şekilde CREATE_ALWAYS olarak ayarlanabilir, böylece mevcut dosyanın üzerine yazılır. Bunun başarılı olup olmadığı, önceki dosyanın öznitelikleri ve güvenlik ayarları gibi faktörlere bağlıdır (daha fazla bilgi için aşağıdaki bölümlere bakın).

Uygulama ayrıca dosyayı okumak, yazmak, her ikisi veya hiçbiri için paylaşmak isteyip istemediğini belirtmek için CreateFile kullanır. Bu, paylaşım moduolarak bilinir. Paylaşılmayan açık bir dosya (dwShareMode sıfır olarak ayarlanır) tanıtıcısı kapatılana kadar, onu açan uygulama veya başka bir uygulama tarafından yeniden açılamaz. Buna özel erişim de denir.

İşlem, paylaşım modunda açılmış olan bir dosyayı (dwShareMode geçerli bir sıfır olmayan değere ayarlanmış) açmaya çalışmak için CreateFile kullandığında, sistem istenen erişim ve paylaşım modlarını dosya açıldığında belirtilen modlarla karşılaştırır. Önceki çağrıda belirtilen modlarla çakişen bir erişim veya paylaşım modu belirtirseniz CreateFile başarısız olur.

Aşağıdaki tabloda, çeşitli erişim modlarını ve paylaşım modlarını (sırasıyladwDesiredAccess, dwShareMode) kullanarak iki adet CreateFile çağrılarının geçerli kombinasyonları gösterilmektedir. CreateFile çağrılarının hangi sırada yapıldığı önemli değildir. Ancak, her dosya tanıtıcısındaki sonraki tüm dosya G/Ç işlemleri, söz konusu dosya tanıtıcısıyla ilişkili geçerli erişim ve paylaşım modları tarafından kısıtlanmaya devam eder.

CreateFile için ilk çağrı CreateFile için geçerli ikinci çağrılar
GENERIC_READ, FILE_SHARE_READ
  • GENERIC_READ, FILE_SHARE_READ
  • GENERIC_READ, FILE_SHARE_READFILE_SHARE_WRITE
GENERIC_READ, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ
  • GENERIC_WRITE, FILE_SHARE_READFILE_SHARE_WRITE
GENEL_OKUMA, DOSYA_PAYLAŞIM_OKUMA, DOSYA_PAYLAŞIM_YAZMA
  • GENERIC_READ, FILE_SHARE_READ
  • GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENEL_OKUMAGENEL_YAZMA, DOSYA_PAYLAŞIM_OKUMASI
  • GENERIC_READGENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_READ
  • GENERIC_READ, FILE_SHARE_WRITE
  • GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_READ, FILE_SHARE_WRITE
  • GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_READ, GENERIC_WRITE, FILE_SHARE_WRITE
  • GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ
  • GENEL_OKUMA, DOSYA_PAYLAŞ_OKUMA, DOSYA_PAYLAŞ_YAZMA
GENEL_OKUMA, GENEL_YAZMA, DOSYA_PAYLAŞIM_YAZMA
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENEL_ÖZET, GENEL_YAZMA, DOSYA_PAYLAŞIM_OZET, DOSYA_PAYLAŞIM_YAZMA
  • GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENEL_OKU, GENEL_YAZ, DOSYA_PAYLAS_OKU, DOSYA_PAYLAS_YAZ

Standart dosya özniteliklerine ek olarak, SECURITY_ATTRIBUTES bir yapıya işaretçi ekleyerek güvenlik özniteliklerini de CreateFiledördüncü parametresi olarak belirtebilirsiniz. Ancak, bunun herhangi bir etkiye sahip olması için temel dosya sisteminin güvenliği desteklemesi gerekir (örneğin, NTFS dosya sistemi bunu destekler, ancak çeşitli FAT dosya sistemleri desteklemez). Güvenlik öznitelikleri hakkında daha fazla bilgi için bkz. erişim denetimi.

Yeni dosya oluşturan bir uygulama şablon dosyasına isteğe bağlı bir tanıtıcı sağlayabilir ve bu tanıtıcıdan CreateFile yeni dosyanın oluşturulması için dosya özniteliklerini ve genişletilmiş öznitelikleri alır.

CreateFile Senaryoları

CreateFile işlevini kullanarak bir dosyaya erişim başlatmaya yönelik çeşitli temel senaryolar vardır. Bunlar şu şekilde özetlenir:

  • Bu ada sahip bir dosya henüz mevcut olmadığında yeni bir dosya oluşturma.
  • Aynı ada sahip bir dosya zaten mevcut olsa bile yeni bir dosya oluşturma, verilerini temizleyerek ve boş olarak başlatma.
  • Var olan bir dosyayı yalnızca mevcutsa ve bozulmamış olması koşuluyla açma.
  • Var olan bir dosyayı yalnızca varsa açma, boş olacak şekilde kesme.
  • Bir dosyayı her zaman açma işlemi: Varsa as-is açılır, yoksa yeni bir dosya oluşturulur.

Bu senaryolar, dwCreationDisposition parametresinin düzgün kullanımıyla denetlenmektedir. Aşağıda, bu senaryoların bu parametrenin değerleriyle nasıl eşlendiğinde ve kullanıldıklarında ne olduğuyla ilgili bir döküm yer almaktadır.

Bu ada sahip bir dosya henüz mevcut olmadığında (dwCreationDispositionCREATE_NEW, CREATE_ALWAYSveya OPEN_ALWAYS) yeni bir dosya oluştururken veya açarken, CreateFile işlevi aşağıdaki eylemleri gerçekleştirir:

  • dwFlagsAndAttributes tarafından belirtilen dosya özniteliklerini ve bayraklarını FILE_ATTRIBUTE_ARCHIVEile birleştirir.
  • Dosya uzunluğunu sıfır olarak ayarlar.
  • hTemplateFile parametresi belirtilirse şablon dosyası tarafından sağlanan genişletilmiş öznitelikleri yeni dosyaya kopyalar (bu, daha önce belirtilen tüm FILE_ATTRIBUTE_* bayraklarını geçersiz kılar).
  • bInheritHandle üyesi tarafından belirtilen devral bayrağı ile lpSecurityAttributes parametresinin (SECURITY_ATTRIBUTES yapısı) üyesi lpSecurityDescriptor tarafından belirtilen güvenlik tanımlayıcısını, eğer sağlanmışsa, ayarlar.

Aynı ada sahip bir dosya zaten mevcut olsa bile (dwCreationDispositionCREATE_ALWAYSolarak ayarlanmış) yeni bir dosya oluştururken, CreateFile işlevi aşağıdaki eylemleri gerçekleştirir:

  • Yazma erişimi için geçerli dosya özniteliklerini ve güvenlik ayarlarını denetler, reddedilirse başarısız olur.
  • dwFlagsAndAttributes tarafından belirtilen dosya özniteliklerini ve bayraklarını FILE_ATTRIBUTE_ARCHIVE ve var olan dosya öznitelikleriyle birleştirir.
  • Dosya uzunluğunu sıfır olarak ayarlar (başka bir ifadeyle, dosyadaki veriler artık kullanılamaz ve dosya boş olur).
  • hTemplateFile parametresi belirtilirse şablon dosyası tarafından sağlanan genişletilmiş öznitelikleri yeni dosyaya kopyalar (bu, daha önce belirtilen tüm FILE_ATTRIBUTE_* bayraklarını geçersiz kılar).
  • lpSecurityAttributes parametresinin (SECURITY_ATTRIBUTES yapısı) içinde belirtilmişse bInheritHandle üyesi tarafından belirlenen devralma bayrağını ayarlar, ancak SECURITY_ATTRIBUTES yapısındaki lpSecurityDescriptor üyesini yoksayar.
  • Eğer aksi takdirde başarılı olursa (yani, CreateFile geçerli bir tanıtıcı döndürürse), GetLastError çağrılması, mevcut dosya yerine "yeni" (boş) bir dosya oluşturmayı amaçladıysanız, bu kullanım örneği için aslında hata olmayan kodu ERROR_ALREADY_EXISTSverecektir.

Mevcut bir dosyayı açarken (dwCreationDispositionOPEN_EXISTING, OPEN_ALWAYSveya TRUNCATE_EXISTING) olarak ayarlanırken, CreateFile işlevi aşağıdaki eylemleri gerçekleştirir:

  • İstenen erişim için geçerli dosya özniteliklerini ve güvenlik ayarlarını denetler, reddedilirse başarısız olur.
  • dwFlagsAndAttributes tarafından belirtilen dosya bayraklarını (FILE_FLAG_*) var olan dosya öznitelikleriyle birleştirir ve dwFlagsAndAttributestarafından belirtilen tüm dosya özniteliklerini (FILE_ATTRIBUTE_*) yoksayar.
  • Dosya uzunluğunu yalnızca dwCreationDispositionTRUNCATE_EXISTINGolarak ayarlanırsa sıfır olarak ayarlar; aksi takdirde geçerli dosya uzunluğu korunur ve dosya as-isaçılır.
  • hTemplateFile parametresini yoksayar.
  • lpSecurityAttributes parametresi sağlanmışsa, (SECURITY_ATTRIBUTES yapısı) bInheritHandle üyesi tarafından belirtilen devralma bayrağını ayarlar, ancak SECURITY_ATTRIBUTES yapısının lpSecurityDescriptor üyesini yoksayar.

Dosya Öznitelikleri ve Dizinleri

Dosya öznitelikleri, bir dosya veya dizinle ilişkilendirilmiş meta verilerin bir parçasıdır ve bunların her biri kendi amacına ve nasıl ayarlanıp değiştirilebileceğine ilişkin kurallara sahiptir. Bu özniteliklerden bazıları yalnızca dosyalara, bazıları ise yalnızca dizinlere uygulanır. Örneğin, FILE_ATTRIBUTE_DIRECTORY özniteliği yalnızca dizinler için geçerlidir: Disk üzerindeki bir nesnenin dizin olup olmadığını belirlemek için dosya sistemi tarafından kullanılır, ancak var olan bir dosya sistemi nesnesi için değiştirilemez.

Bazı dosya öznitelikleri bir dizin için ayarlanabilir, ancak yalnızca bu dizinde oluşturulan ve varsayılan öznitelikler olarak davranan dosyalar için anlamlıdır. Örneğin, FILE_ATTRIBUTE_COMPRESSED bir dizin nesnesi üzerinde ayarlanabilir, ancak dizin nesnesinin kendisi gerçek veri içermediğinden, gerçekten sıkıştırılmaz; ancak, bu öznitelikle işaretlenmiş dizinler dosya sistemine bu dizine eklenen tüm yeni dosyaları sıkıştırmasını söyler. Bir dizinde ayarlanabilen ve bu dizine eklenen yeni dosyalar için de ayarlanacak tüm dosya öznitelikleri,devralınan özniteliği olarak adlandırılır.

CreateFile işlevi, bir dosya oluşturulduğunda belirli dosya özniteliklerini ayarlamak için bir parametre sağlar. Genel olarak, bu öznitelikler bir uygulamanın dosya oluşturma zamanında kullanması en yaygın olan özniteliklerdir, ancak CreateFileiçin tüm olası dosya öznitelikleri kullanılamaz. Bazı dosya öznitelikleri, SetFileAttributes, DeviceIoControlveya dosya zaten var olduktan sonra DecryptFile gibi diğer işlevlerin kullanılmasını gerektirir. FILE_ATTRIBUTE_DIRECTORYsöz konusu olduğunda oluşturma zamanında CreateDirectory işlevi gerekir çünkü CreateFile dizin oluşturamaz. FILE_ATTRIBUTE_REPARSE_POINT ve FILE_ATTRIBUTE_SPARSE_FILE, özel işleme gerektiren ve DeviceIoControlgerektiren dosya öznitelikleridir. Daha fazla bilgi için bkz. SetFileAttributes.

Daha önce belirtildiği gibi, dosya özniteliği devralma, dosyanın bulunacağı dizin özniteliklerinden okunan dosya öznitelikleriyle bir dosya oluşturulduğunda gerçekleşir. Aşağıdaki tabloda bu devralınan öznitelikler ve bunların CreateFile özellikleriyle ilişkisi özetlenmiştir.

Dizin öznitelik durumu CreateFile yeni dosyalar için devralma geçersiz kılma yeteneği oluşturun
FILE_ATTRIBUTE_COMPRESSED ayarlanmıştır.
Kontrol yok. Temizlemek için DeviceIoControl kullanın.
FILE_ATTRIBUTE_COMPRESSED ayarlanmadı.
Kontrol yok. Ayarlamak için DeviceIoControl kullanın.
FILE_ATTRIBUTE_ENCRYPTED ayarlayın.
Kontrol yok. DecryptFilekullanın.
FILE_ATTRIBUTE_ENCRYPTED ayarlanmadı.
CreateFilekullanılarak ayarlanabilir.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED olarak ayarlayın.
Kontrol yok. Temizlemek için SetFileAttributes kullanın.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED ayarlanmadı.
Kontrol yok. Ayarlamak için SetFileAttributes kullanın.

Erişim Denetimi

CreateFile

DeviceIoControl

Dosya Öznitelik Sabitleri

Dosya Sıkıştırma ve Çözme

Dosya Şifrelemesi

Dosya Yönetimi İşlevleri

Tutamaklar ve Nesneler

Devralma İşleme

Bir Dosyayı Okuma veya Yazma için Açma

SetFileAttributes