Merhaba,
Belki gereksiz bir şey yaptım; Windows'un dosya yazma/okuma sınırlamalarını ve işin doğasını anlamak için std.file sınıfından iki işlevi çıkardım. Çünkü bana dosya listeleme, silme ve bilcümle yararlı/yarasız şey gerekmiyordu. Sonuçları şöyle oldu:
import std.file;
void main(){
string deneme = "deneme.txt";
write(deneme, "GÜNAYDIN");
assert(read(deneme) == "GÜNAYDIN");
}
Yukarıdaki kodu DMD 2.59 sürümü ile derlediğimde 1.127 byte object kodu, 368.668 byte binary dosya boyutları meydana geldi. Aynı işlevi çalıştıran aşağıdaki kodu derlediğimde ise 14.727 byte object kodu, 181.788 byte binary dosya boyutları meydana geldi. Önemsiz bir ayrıntı gibi görünse de 10 kattan fazla object koda rağmen yarı yarıya binary dosya derlenmesi ilginç.
Alıntı (stf.file sınıfındaki write, read işlevleri):
>> import core.sys.windows.windows, std.windows.syserror;
> import std.algorithm, std.array, std.conv, std.typetuple;
>
> class FileException : Exception {
> immutable uint errno;
> this(in char[] name, in char[] msg, string file = __FILE__,
> size_t line = __LINE__)
> {
> if(msg.empty) super(name.idup, file, line);
> else super(text(name, ": ", msg), file, line);
> errno = 0;
> }
> this(in char[] name, uint errno = .GetLastError(),
> string file = __FILE__,
> size_t line = __LINE__)
> {
> this(name, sysErrorString(errno), file, line);
> this.errno = errno;
> }
> }
>
> T cenforce(T)(T condition, lazy const(char)[] name, string file = __FILE__,
> size_t line = __LINE__)
> {
> if (!condition) throw new FileException(name, .GetLastError(), file, line);
> return condition;
> }
>
> void[] read(in char[] name, size_t upTo = size_t.max) {
> alias TypeTuple!(GENERIC_READ,FILE_SHARE_READ,(SECURITY_ATTRIBUTES*).init,
> OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL |
> FILE_FLAG_SEQUENTIAL_SCAN,HANDLE.init) defaults;
>
> auto h = CreateFileW(std.utf.toUTF16z(name), defaults);
> cenforce(h != INVALID_HANDLE_VALUE, name);
> scope(exit) cenforce(CloseHandle(h), name);
>
> auto size = GetFileSize(h, null);
> cenforce(size != INVALID_FILE_SIZE, name);
> size = min(upTo, size);
>
> auto buf = uninitializedArray!(ubyte[])(size);
> scope(failure) delete buf;
>
> DWORD numread = void;
> cenforce(ReadFile(h,buf.ptr,size,&numread,null)
> == 1 && numread == size,name);
> return buf[0 .. size];
> }
>
> void write(in char[] name, const void[] buffer) {
> alias TypeTuple!(GENERIC_WRITE,0,null,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL |
> FILE_FLAG_SEQUENTIAL_SCAN,HANDLE.init) defaults;
>
> auto h = CreateFileW(std.utf.toUTF16z(name), defaults);
> cenforce(h != INVALID_HANDLE_VALUE, name);
> scope(exit) cenforce(CloseHandle(h), name);
>
> DWORD numwritten;
> cenforce(WriteFile(h,buffer.ptr,to!DWORD(buffer.length),&numwritten,null)
> == 1 && buffer.length == numwritten,name);
> }
> ```
>
Bu vesileyle (std.file sınıfı üzerinden) bir GÜNAYDIN demiş ve yeni girdiğimiz İngilizce kod serbestliğini denemiş oldum. Tabi Boost License 1.0'ı çiğnemiş oldum mu emin değilim...:)
Sevgiler, saygılar...
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]