9 Mart 2016 Çarşamba

Dosya İşlemleri

Bu yazıyla ilgili olarak Dizin İşlemleri başlıklı yazıya göz atabilirsiniz 

Dosyanın Yaratılma Zamanını Bulma
Not : Linux/Unix türevlerinde dosyanın yaratılma tarihi saklanmaz!

Java
Files.readAttributes() kullanılır.
  
Dosyanın Son Yazılma Zamanını Bulma

boost
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
fs::path p ("Path to my file");
fs::last_write_time(p);

C
struct stat file;
stat("path", &file);
struct tm* time = localtime(&file->st_mtime);
Stat ile gelen diğer alanların açıklamalarını buradan aldım.

Eğer elimizde dosyanın file descriptor'ı varsa fstat() metodu da kullanılabilir. Örnek:

FILE * pf = fopen("filename", "r");
int fd = fileno(pf);
struct stat ss = {0};
fstat(fd, &ss);

Java
lastModified() ile bu iş başarılabiliyor.
Java 7 ile aşağıdaki gibi de yapılabilir.
Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());
Windows
GetFileTime metodu kullanılır.
 
Dosyanın Son Erişilme Zamanını Bulma
Java
Java 7 ile aşağıdaki kod kullanılabilir. Paths sınıfı bir Path nesnesi döner. Path nesnesi File() sınıfına göre kullanması daha kolay bir sınıf.
Path file = Paths.get("/home/user/");

BasicFileAttributes attrs = Files.readAttributes(file, BasicFileAttributes.class);
FileTime time = attrs.lastAccessTime();

System.out.println("Last accessed at:" + time);
Date accessTime = new Date(time.toMillis());

Dosyanın Gerçek Olduğunu Kontrol Etme
boost
boost::filesystem::is_regular_file() metodu kullanılabilir.


boost::filesystem:exists(fileName) metodu da kullanılabilir. 

C
stat
stat metodu yazısına taşıdım.


POSIX
access
Örnekte access() metodu kullanılarak dosyanın mevcudiyeti kontrol ediliyor.

Buradaki soruda access() metodunun man sayfasında yazılı olan güvenlik uyarısının root olarak çalışan uygulamaları ilgilendirdiği açıklanmış.

Windows
_stat kullanılabilir.


Aynı zamanda GetFileAttributesW de kullanılabilir. boost'un nasıl yaptığını gösteren iyi bir örnek burada.

C++
Örnekte ifstream kullanılarak dosyanın açılıp açılamadığı kontrol edilmiş.
std::ifstream ifs (filename);
ifs.is_open() ;

Java
File.isFile() metodu kullanılır.
  
Dosya Varsa Yazma İşlemini Yapmama
C
Burada da açıklandığı gibi  eğer dosya varsa O_CREATE etkisiz elemandır. Bir tek O_EXCL ile kullanıldığı zaman dosya varsa, açma işlemininde hata kodu dönülmesine sebep olur. Örnek:
int fd = open( file, O_WRONLY | O_CREAT | O_EXCL, 0644);//Dosya varsa hata döner   
Dosya Yoksa Yazmak İçin Yaratma

C
Not : daha eski olan creat() metodu ile open metodu ile aynı işlevi görür ama bence kullanmamak lazım. 

Dosyayı yaratır, eğer varsa boşaltır.
int fd = open("file", O_WRONLY | O_CREAT | O_TRUNC, 0755); 

Dosyayı açarken kullanılan sabitler : O_CREAT , O_WRONLY, O_RDONLY, O_TRUNC

Haklar için kullanılan bitler (Permission bits) burada. Tüm bitler S_I ile başlarlar. Daha sonra R,W veya X harfleri gelir. Bunlar okuma yazma ve çalıştırma haklarını belirtirler. USR/U, GRP/G , OTH/O gibi bitler ise sırasıyla kullanıcı (user), grup (group), diğerleri (other) şeklinde grupları tanımlarlar.

Okuma hakları için kullanılan sabitler : S_IRUSR, S_IRGRP, S_IROTH
Yazma hakları için kullanılan sabitler : S_IWUSR, S_IWGRP , S_IWOTH
Okuma,Yazma,Çalıştırma hakları için kullanılan sabitler : S_IRWXU , S_IRWXG , S_IRWXO

Java
Dosya ilk defa yaratılacaksa aşağıdaki kod kullanılabilir. createNewFile dosyayı atomik olarak yaratır.Örneği buradan aldım.

Dosyanın Sonuna Ekleme Yapma
C++
ofstream ve kullanılan bayrakların açıklaması burada.
ofstream f(filename, ios_base::out | ios_base::app);//ios_base::app ile appen yapılır
Java
FileOutputStream fos = new FileOutputStream(file, true);//true ile append yapılır 
veya
FileWriter fw = new FileWriter(file, true);  //true ile append yapılır 
Apache Commons
FileUtils.writeStringToFile metodu ile verilen dosyanın sonuna bir satır eklemek mümkün. Son parametre olan true satırın eklenmesini için lazım.
Örnek:

Dosyayı Boşaltma
C#
Örnek:

Çok Büyük Bir Dosya Oluşturma
POSIX
Eğer diske yazılacak olan dosyanın büyüklüğü önceden biliyorsa işletim sistemine istenilen büyüklük posix_fallocate metodu ile söylenebilir. Böylece diskte bloklar arasında bölünme olmasının önüne geçilir.
GNU kütüphanesinin dosyayı boş karakterler ile doldurduğu koddan görülebiliyor. Buradaki soruda ise posix_fallocate ile fallocate metodları karşılaştırılıyor.

truncate ve ftrunctate ile de çok büyük bir dosyayı oluşturmadan önce dosya için yeterli yer ayrılması gerçekleştirilebilir. Örnek:



Dosya  ve Haklar
POSIX
Okuma hakkımız olup olmadığını anlamak için access metodunu kullanıyoruz.

Dosyanın izin bitlerini okumak için stat() metodunu kullanıyoruz.

Dosyadaki haklarımız değiştirmek için chmod metodunu kullanırız.

Normal şartlarda oluşturulan dosyalar umask komutuyla tanımlı olan değer ile "and" lenerek kullanılıyor. umask genellikle 0022 olarak tanımlıdır.
 
Java
Okuma hakkımız olup olmadığını anlamak için canRead() metodunu kullanıyoruz.
Yazma hakkımız olup olmadığını anlamak için canWrite() metodunu kullanıyoruz. 

Ayrıca POSIX haklarını öğrenmek için PosixFileAttributeView kullanılabilir.
 
PosixFileAttributes attrs = Files.getFileAttributeView(file, PosixFileAttributeView.class).readAttributes();
System.out.format("%s %s%n",attrs.owner().getName(),PosixFilePermissions.toString(attrs.permissions())); 

 
Geçici Dosya Oluşturma
POSIX
mkstemp ile geçici dosya oluşturuluyor. Buradaki soruda mkstemp'in verilen buffer'ı değiştirdiği yazılı.
C
Şu satırı dahil etmek lazım.
#include <stdio.h>
Açıklaması şöyle.
The temporary file created is automatically deleted when the stream is closed (fclose) or when the program terminates normally. If the program terminates abnormally, whether the file is deleted depends on the specific system and library implementation."
tmpfile() metodu mkstemp() gibi geçici dosya oluşturuluyor. Ancak bu sefer int fd yerine FILE* dönüyor. fclose ile kapatılınca, dosya otomatik olarak silinir.

QT
QTemporaryFile ile bu iş yapılabiliyor. Örneği buradan aldım.

Java 
File.createTempFile metodu ile geçici bir dosya oluşturmak mümkün. Eğer istenirse dosyanın oluşturulacağı dizin aşağıdaki metodu kullanarak seçilebilir. Bu metod bize boş bir File oluşturur.
Geçici Dosya İçin İsim Oluşturma
C
tmpnam ile eşi olmayan bir isim yaratılması mümkün. İsim /tmp dizininde  Örnek:

char *tempFilenameStub = tmpnam(NULL);

char wavFile[L_tmpnam + 5];  //L_tmpnam stdio.h'dan gelir
sprintf(wavFile, "%s.wav", tempFilenameStub);  
 
boost
Dosya oluşturmak için eşi olmayan bir isim yaratılması mümkün. Cevabı buradan aldım.
Dosya İsminin Geçersiz Karakter İçermediğini Kontrol Etme
C#
Validating a filename in c# sorusundan aldım.
Dosya İsminin Uzantısını Alma
QT
QFileInfo sınıfını kullanabiliriz.
QString filename = ...
QFileInfo fileInfo(filename);
fileInfo.suffix();
Dosya İsminin Mutlak Yapılması
Göreceli (relative) isimlerin mutlak (absolute veya fully qualified) hale getirilmesi
C
Sanırım realpath() kullanılabilir.

Java
getAbsolutePath() ile yapılır. "/some/path" şeklindeki bir ismi "C:\some\path" haline getirir. getCanonical'dan farkı olarak dosya ismindeki . veya .. gibi karakterleri çıkartmaz. Örneğin "test/.././file.txt" sadece "C:\projects\sandbox\trunk\test\..\.\file.txt" haline gelir. Oysa canonical yapılsaydı, elimize "C:\projects\sandbox\trunk\file.txt" geçecekti. Dolayısıyla getAbsolutePath() yerine getCanonical()'ın kullanılması bence en garanti yol.

QT
QFileInfo sınıfının absolutePath() metodu kulllanılabilir. Örnek:


Dosya İsminin Canonical Yapılması
Canonicalization bir çok anlama gelebilir. Dosya isimleri bağlamında dosya ismindeki . veya .. gibi karakterleri çıkartmaya yarar. Örneğin /home/myuser/program dizinine /../somedir dizinini eklersek /home/myuser/program/../somedir
olur ancak aslında bu /home/myuser/somedir dizinine eşittir. 
boost
canonical metodu ile . veya .. gibi karakterler dosya isminden çıkarılır. Örnek:
fs::canonical("C:\\Temp\\boost\\test.txt").string();//"C:/Temp\boost\test.txt" verir
Java
Örneği What's the difference between a file's path, absolute path, and canonical path? sorusundan aldım.
File file = new File("../testing/file1.txt");
//canonical path:C:\projects\workspace\testing\file1.txt
System.out.println("canonical path:" + file.getCanonicalPath());
Burada dikkat edilmesi gereken nokta getCanonicalPath() metodunun sembolik linkleri çözümlemesidir. Örneğin /home isimli dizin aslında /home/kit.ho/ dizinine sembolik link ise getCanonicalPath() metodu ile /home ile başlayan biz dizin yerine /home/kit.ho/ ile başlayan biz dizin elde ederiz.
Java 7
Path.normalize() ile gereksiz karakterleri çıkartmak mümkün.
Guava
Files.simplifyPath() ile gereksiz karakterleri çıkartmak mümkün.
Apache Commons
FileUtils.normalize() metodu ile Java'daki File.getCanonicalPath() metodunun aksine sembolink linkleri çözümlemeden gereksiz karakterleri çıkartma işlemi yapılabilir.
Guava

Dosyaya Hard Link Oluşturma
Konuyu Hard ve Soft Link başlıklı yazıya taşıdım.

Dosyaya Hard Link Sayısını Öğrenme
Konuyu Hard ve Soft Link başlıklı yazıya taşıdım.

Dosyanın Sembolik Link Olup Olmadığını Kontrol Etme
Konuyu Hard ve Soft Link başlıklı yazıya taşıdım.
    
Dosyaya Sembolik Link Oluşturma
Konuyu Hard ve Soft Link başlıklı yazıya taşıdım.

Dosyanın Device ID'sini Öğrenme
POSIX
Örnek:
#include <sys/stat.h>
int fd;
struct stat sb;
fstat(fd, &sb);
printf("%u %u\n", major(sb.st_rdev), minor(sb.st_rdev));

Dosyanın Büyüklüğünü Bulma
Dosyanın Büyüklüğünü Bulma yazısına taşıdım.

Dosya Büyüklüğünü Okunabilecek hale Getirme
Dosya büyüklükleri okunacak hale getirilirken kullanılan iki yöntem var. JEDEC KB, MB (1000 ve katları) yöntemini kullanıyor. IEC ise KiB, MiB (1024 ve katları) birimlerini kullanıyor.

IEC Yöntemi
Dosya büyüklükleri okunacak hale getirilirken kibibyte cinsinden çevrilebilir. Çevrimde 1 kilobyte 1024 byte olarak kabul edilir. İnsanların alışık oldukları üzere kilo kelimesi 1000'in katı değildir. Dosyanın byte büyüklüğünü 1000'e bölmek yanlış sonuç verir.

Örnek:


Dosyaya Satır Ekleme
C#
File.AppendText metodu ile mevcut dosyaya UTF-8 string eklemek çok kolay. Örnek:
File.AppendAllText metoduyla yukarıdaki gibi StreamWriter yaratmadan ekleme de yapılabilir.
 
Dosyanın Tamamını Satırlar Olarak Okuma
C#
File.ReadAllLines ile dosyanın tamamını okumak mümkün.
Guava
Files.readLines ile dosyanın tamamını okumak mümkün.

Dosyanın Tamamını Byte'lar Olarak Okuma
C++
std::ios::binary kullanarak dosyayı binary olarak okumak mümkün.
Örnek: 

Java
Java: Advice on handling large data volumes. (Part Deux) sorusunda ise BufferedReader yerine MappedByteBuffer kullanmanın daha hızlı olduğu söylenmiş. Ben hızlarını karşılaştırmadım ancak aşağıya bir örnek ekledim.

FileInputStream fis = new FileInputStream(f);
FileChannel fc = fis.getChannel();

MappedByteBuffer mmb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());

byte[] buffer = new byte[(int)fc.size()];
mmb.get(buffer);

fis.close();//Close FileInputStream

C#
ReadAllBytes metodu ile yapılabilir.
FileStream kullanılmak istenirse aşağıdaki gibi yapılabilir.
String fileName=//..
FileStream fs = File.OpenRead(fileName);
byte[] data = new byte[fs.Length];
fs.Read(data,0,(int)fs.Length);
Dosyanın Tamamını Satırlar Olarak Teker Teker Okuma
Konuyu Dosya İşlemleri - Okuma başlıklı yazıya taşıdım.

Dosyanın Tamamını Tek Bir String Olarak Okuma
Apache Commons
Java: How to convert a File object to a String object in java? sorusunda cevap var.
FileUtils.readFileToString(file, charset);
Guava
Files.toString(file, charset);
QT
QIODevice::readAll() metodu ile bu iş başarılabilir.

Dosyanın Tamamını Kelime Kelime Okuma
C++
// the file to read from
ifstream reader("file.txt");
string word;
while(!reader.eof()){ // while there still is stuff to read
    reader >> word;  // read one word
    //Process word here
}
Bir başka örnekte ise stringstream kullanılmış. stringstream sınıfını doldurmak için ya sınıfın constructor metodu kullanılabilir ya da sınıfın << operatörü kullanılabilir.

Her iki yöntemin çalışma sebebi, string için std::operator>>(..) metodunun tanımlı olması. Bu metod EOF ya da boşluk karakterine denk gelinceye kadar kelimeyi okumaya çalışır.

Dosyayı Belli Bir Karaktere Kadar Okuma
C
fgetc ile karakter karakter okunuyor.
Örnek:


Dosyanın Tamamını Sabit Büyüklüklerde Okuma
Java
Örneğin 20 byte büyüklüğünde okumak için aşağıdaki örnek kullanılabilir.


Dosyadaki Satırları Parse Ederek Okuma 
Java
Örneği buradan aldım. 

C#
What's a nice class like TextFieldParser doing in a namespace like Microsoft.VisualBasic? sorusunda TextFieldParser sınıfının kullanım örneği var.
 using (var myCsvFile = new TextFieldParser(myFilePath)
{

    myCsvFile.TextFieldType = FieldType.Delimited;
    myCsvFile.SetDelimiters(",");
    myCsvFile.CommentTokens = new[] { "HEADER", "COMMENT: ", "TRAILER" };
    while (!myCsvFile.EndOfData)
    {
        string[] fieldArray;
        try
        {
            fieldArray = myCsvFile.ReadFields();
        }
        catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex)
        {
            // not a valid delimited line - log, terminate, or ignore
            continue;
        }
        // process values in fieldArray
    }
}
Özel dosyaları okuma
Java
Jar dosyasındaki bir dosyaya erişmek için aşağıdaki kod kullanılabilir.
URL url = getClass().getResource("Invoice.js");
File file = new File(url.getPath());
Resource Dosyalarını Okumak içinse aşağıdaki kod kullanılabilir.
ResourceBundle bundle = ResourceBundle.getBundle("sql");//sql.properties dosyasını aç
PreparedStatement psmt = connection.prepareStatement(bundle.getString("users.query"));
Spring
ResourceBundleMessageSource ile birden çok ResourceBundle okunabilir. Birden çok dosyayı okuma örneğini buradan aldım. images.properties, errors.properties ve globalMsgs.properties dosyaları okunabilir.
<beans>
  <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
      <list>
        <value>images</value>
        <value>errors</value>
        <value>globalMsgs</value>
      </list>
    </property>
  </bean>
</beans>   

Dosya İçinde Düzenli İfade Arama
boost
Buradaki örnekte gösterildiği gibi kelime kelime düzenli ifade ile arama yapmak mümkün. istream_iterator<string> boşluklarla ayrılmış kelimeleri dolaşır. istream_iterator'ın stream'i nasıl okuyabildiğine dair bir açıklamayı STL Algoritmaları başlıklı yazının Iterator'ın Adaptör Olarak Kullanılması bölümünde bulabilirsiniz.

 
Dosyayı Kilitleme
C
flock
Bu metodu kullanabilmek için şu satır dahil edilir.
#include <sys/file.h>
Şöyle kullanırız.
int main(void)
{
 
  int fd = open("lock.txt", O_WRONLY | O_CREAT, 0644);
  int lock_ret = flock(fd, LOCK_EX);
  ...
  lock_ret = flock(fd, LOCK_UN);
}

fctnl
flock yapısı doldurulduktan sonra fcntl() metodna geçiliyor. fcntl() ile başka işlemler de yapabilmek mümkün. Bu konu için fcntl POSIX metodu başlıklı yazıya bakabilirsiniz.

Yazma kilidi için örnek :
Okuma kilidi için örnek:
                        /* l_type        l_whence       l_start  l_len  l_pid   */
struct flock fl = {F_RDLCK, SEEK_SET,   0,       0,       0 };
fl.l_pid = getpid();
int fd = open("lockdemo.c", O_RDWR);
if (fcntl(fd, F_SETLKW, &fl) == -1) {
    perror("fcntl");
    exit(1);
}
Uyarı : 
Okuma kilidinde flock struct'ı {} kullanılarak dolduruluyor. Ancak buradaki soruda da açıklandığı gibi MacOs üzerinde struct'ın sırası değişik. Bu yüzden problem çıkabilir. en güzeli yazma örneğindeki gibi alan isimlerini kullarak doldurmak.

flock ile yapılan dosya kilitlemesi sadece tavsiye (advisory) niteliğinde. Herhangi bir zorunluluk getirmez. Kilitli bir dosyayı başka bir uygulamanın açmayacağı farz edilir.

Linux'ta zorunlu (mandatory) locking yapabilmek mümkün. Burada nasıl yapılacağı açıklanmış. Öncelikle dosya sistemi "- mand" seçeneği ile yükleniyor.

Daha sonra kilit dosyasındaki bazı haklar kaldırılıyor. Set Group ID hakkı verilirken, Group Execute hakkı kaldırılıyor. SGUID ile SUID benzer mantıkla çalılıyorlar. SGUID dosyanın sahibi olan grubun üyesiymişiz gibi çalışmamızı sağlıyor.

# chmod g+s,g-x mandatory.txt
Execute hakkı kaldırıldığı için dosyada grup için "rwS" gibi bir şey görmemiz lazım. S'nin büyük harf olduğuna dikkat edilmeli. Aşağıdaki program örneği ile kilidin çalıştığı denenebilir.


İlginç bir detay da
open(path, O_NONBLOCK | O_RDONLY | O_DIRECT) 
şeklinde non-blocking açılan dosyanın advisory locking kullanırken asenkron çalışmaması, ancak mandatory locking kullanırken işe yaraması.

flockfile
flock()'a benzerlik gösteren bir başka komut ise flockfile(FILE*)
Buradaki örnekte flockfile() ile printf'in thread-safe hale getirilmesi örneği var.

boost
boost:interprocess::file_lock kullanılabilir.

Java
FileChannel sınıfının lock() ve tryLock() metodları kullanılarak FileLock sınıfını elde ediliyor.
FileInputStream in = new FileInputStream(file);
try {
    java.nio.channels.FileLock lck = in.getChannel().lock();
    try {
        Reader reader = new InputStreamReader(in, charset);
        ...
    } finally {
        lck.release();
    }
} finally {
    in.close();
}
Burada dikkat edilmesi gereken nokta FileChannel nesnesi zaten kilitli iken aynı nesneyi tekrar kilitlemek istersek bloke olmak yerine OverlappingFileLockException exception'ı atar.

Eğer FileInputStream FileLock kapanmadan close() edilirse, lock otomatik olarak bırakılırmı bilmiyorum.

C#
Örneği buradan aldım. FileStream sınıfı dosyaya okuyup yazmak için kullanılabildiği gibi dosyayı kilitlemek için de kullanılıyor.

FileStream fileLockStream = File.Open("file2Lock", FileMode.Open);
using (fileLockStream){
    fileLockStream.Lock(0, fileLockStream.Length);
    //do something...
    fileLockStream.Unlock(0, fileLockStream.Length);
}
FileStream sınıfını otomatik olarak Unlock() yapan bir başka örnek ise burada var. Örnekte dosya okuma ve kimse ile paylaşmama hakları ile açılıyor.

Bir diğer alternatif ise FileShare seçeneklerini kullanmak. FileShare.None ile diğerlerinin erişimi engelleniyor. Örnek:

Dosyaları İzleme
C#
FileSystemWatcher sınıfı bir dizin izlemek için kullanılır. Hangi dizinin ve işlemin izleneceği belirtilir.
FileSystemWatcher watcher = new FileSystemWatcher(@"DirectoryPath");
watcher.Filter = "*.*";//Watch all the files
watcher.EnableRaisingEvents = true;

//Specifies changes to watch for in a file or folder.
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size;
Daha sonra Changed, Created,Delete işlemleri izlenebilir.
watcher.Changed += new FileSystemEventHandler(watcher_Changed);
watcher.Created += new FileSystemEventHandler(watcher_Created);
watcher.Deleted += new FileSystemEventHandler(watcher_Deleted);
Event handle içinde dosyanın full path'ine şöyle erişiriz.
//Raise when new file is created
private void watcher_Created(object sender, FileSystemEventArgs e)
{Console.WriteLine (e.FullPath);}

QT
QFileSystemWatcher sınıfı dosyaları izlemek için kullanılabilir.


Dosyanın File System Tipini Bulma
statfs sistem çağrısı ile bu işlem yapılabiliyor. Örnek
#include <sys/statfs.h>

struct statfs foo;
if (statfs ("/foo/bar", &foo)) {
    /* error handling */
}

if (foo.f_type == NFS_SUPER_MAGIC) {
    /* nfs warning */
}
Dosyayı Silme
POSIX
unlink ile yapılır.

C++
std::remove() metodu ile yapılıyor.
#include <cstdio>

int main() {
    std::remove("/home/js/file.txt");
}
boost
boost::filesystem::remove() ile yapılıyor . Örnek : 
boost::filesystem::remove(boost::filesystem::path( “/users/myfile” ));

C#
File.Delete(String path) metodu ile yapılıyor

Java
File sınıfının delete() metodu ile yapılıyor.
File file = new File("filePath");
file.delete();
Ya da Files sınıfının delete metodu ile yapılabilir.
Files.delete(path);
Burada dikkat edilmesi gereken şey silinen dosya çöp kutusuna atılmaz, direkt silinir.

Dosya Kopyalama
boost
Bir dosyayı başka bir yere kopyamala için boost::filesystem::copy_file kullanılabilir. Örnek:
boost::filesystem::copy_file(source, destination, boost::filesystem::copy_option::overwrite_if_exists);

Apache Commons
FileUtils.moveFile(File srcFile,File destFile) throws IOException ile yapılabilir. Böylece burada anlatıldığı gibi platforma göre değişebilen sonuçlarda kaçınılabilir.
Bu metod ilk önce File.renameTo() metodunu deniyor. Eğer bu başarısız olursa, kendi kopyalamaya çalışıyor.



Dosyanın İsmini Değiştirme
boost
#include <boost/filesystem.hpp>
boost::filesystem::rename(
        boost::filesystem::path("input.txt"),
        boost::filesystem::path("output.txt"));
Java
File a = new File ("oldFile");
a.renameTo(new File("newFile");
Java 7
İşlemin atomic olması için örnek:

QT
QFile kullanılarak yapılabilir.
QFile::rename ("oldFile","newFile");
C#
System.IO.File.Move(path,newPath);

1 yorum:

  1. Merhaba sevgili hocam sitenizi analiz ettim baktım güzel paylaşımlar yapıyorsunuz ve sizi herzaman takip ediyorum yararlı paylaşımlar yapıyorsunuz. Teşekkürler….

    YanıtlaSil