FANDOM


Introduction Edit

This tutorial demonstrates some of the filesystem operations available to Neko programs. The neko.FileSystem class contains most of the methods we will use.


Input Edit

The example can accept a command line argument. If an argument is specified, it is used as the input file to use throughout the example. If no argument is specified the input file will be named "input.txt."


Pre/Post Conditions Edit

Before running the program, create a file in the current directory. It can contain anything or can be empty. If it's not named "input.txt," pass its name to the program on the command line.

When the program completes there will be a subdirectory in the current directory named "subdir" which contains a copy of the input file. The filename of the copy will be the name of the input file with "renamed_" prepended to it.

Walkthrough Edit

In this example, we will: - check that the input file exists - query the system for the file's access time, size, etc. - check if a directory exists. - create a subdirectory - make two copies of the input file in the subdirectory - rename one of the copies - make a directory listing of the subdirectory - delete one of the copies in the subdirectory

Notes Edit

At each step, we check to see if input files exist before they are read. We also check if output files exist after they've been written. If a file is expected and not found, the program reports the error and exits.

The following statements both return true if dirname is the name of an existing directory: - neko.FileSystem.isDirectory(dirname) - neko.FileSystem.kind(dirname) == neko.FileKind.kdir

Path strings can use either / or \ as directory separators.

Running the program a second time will not give the same output since the subdirectory and renamed file will already exist. Repeated runs will satisfy the post-conditions stated above, though.

The Code Edit

import neko.FileSystem; import neko.Sys; import neko.io.File;

class FileSystemExample {

static function main()
 {
   // get filename from command line arg, or use "input.txt" if no arg specified
   var fname = (neko.Sys.args().length==0) ? "input.txt" : neko.Sys.args()[0];
   neko.Lib.println("filename: " + neko.FileSystem.fullPath(fname));
// check that file exists 
   if( neko.FileSystem.exists(fname) ) 
     neko.Lib.println("file exists"); 
   else 
   { 
     neko.Lib.println("file not found"); 
     neko.Sys.exit(1); // quit 
   }
// check file attributes 
   var stat:FileStat = neko.FileSystem.stat(fname); 
   neko.Lib.println("Last access time: " + stat.atime); 
   neko.Lib.println("Last modification time: " + stat.mtime); 
   neko.Lib.println("Last status change time: " + stat.ctime);
// create a subdirectory if it doesn't already exist 
   var dirname = "subdir"; 
   if( !neko.FileSystem.exists(dirname) ) 
   { 
     neko.FileSystem.createDirectory(dirname);
// check that it was successfull 
     if( neko.FileSystem.exists(dirname) && neko.FileSystem.isDirectory(dirname)

&& neko.FileSystem.kind(dirname) == neko.FileKind.kdir ) neko.Lib.println("subdirectory " + dirname + " was created");

else
     {

neko.Lib.println("subdirectory creation failed"); neko.Sys.exit(1); // quit

}
   }
   else

neko.Lib.println("subdirectory already existed");

// put two copies of the file into the new subdirectory 
   neko.io.File.copy(fname, dirname + "/" + fname); 
   neko.io.File.copy(fname, dirname + "/duplicate_" + fname);
// check that new files exist 
   if( neko.FileSystem.exists(dirname + "/" + fname) &&

neko.FileSystem.exists(dirname + "/duplicate_" + fname) )

neko.Lib.println("copy successfull");
   else
   {
     neko.Lib.println("copy failed");
     neko.Sys.exit(1); // quit
   }
// delete renamed file if it exists from a previous run 
   if( neko.FileSystem.exists(dirname + "/renamed_" + fname) ) 
   { 
     neko.FileSystem.deleteFile(dirname + "/renamed_" + fname); 
     neko.Lib.println("deleted old renamed file"); 
   }
// rename second new file 
   neko.FileSystem.rename(dirname + "/duplicate_" + fname, dirname + "/renamed_" + fname);
// check that rename was successfull 
   if( !neko.FileSystem.exists(dirname + "/duplicate_" + fname) &&

neko.FileSystem.exists(dirname + "/renamed_" + fname) )

neko.Lib.println("rename successfull");
   else
   {
     neko.Lib.println("rename failed");
     neko.Sys.exit(1); // quit
   }
// get directory listing for subdir 
   var files = neko.FileSystem.readDirectory(dirname); 
   neko.Lib.println("subdirectory listing:"); 
   for( ff in files) 
     neko.Lib.println(" " + dirname + "/" + ff);
// delete first copy 
   neko.FileSystem.deleteFile(dirname + "/" + fname);
// check that delete was successfull 
   if( !neko.FileSystem.exists(dirname + "/" + fname) ) 
     neko.Lib.println("delete successfull"); 
   else 
   { 
     neko.Lib.println("delete failed"); 
     neko.Sys.exit(1); // quit 
   } 
 }

}


Compile and run with: haxe -neko filesysex.n -main FileSystemExample neko filesysex

The first time it runs, the output should resemble the output below. The file path and access times will differ. The direction of the path separators will be appropriate for the current operating system. filename: c:\haXe\filesystem\input.txt file exists Last access time: 2009-04-14 15:26:53 Last modification time: 2007-10-29 12:30:54 Last status change time: 2007-10-29 12:26:00 subdirectory subdir was created copy successfull rename successfull subdirectory listing:

subdir/input.txt
subdir/renamed_input.txt

delete successfull

Community content is available under CC-BY-SA unless otherwise noted.