Using the file system API

The org.eclipse.core.filesystem plug-in provides a generic API for interacting with an arbitrary file system. This API is similar to java.io.File, with a few key differences:

In the file system API, the path for any given file is represented as a hierarchical java.net.URI. The URI scheme represents the kind of file system, and the URI path component represents the location of the file within the file system tree. Thus any given hierarchical URI represents a potential file or directory in some arbitrary file system.

The API for working with files and file systems is found in the org.eclipse.core.filesystem) package. The central API type is IFileStore Each instance of IFileStore represents a single file in the file system. As with IResource, the existence of an IFileStore instance does not mean that such a file exists on disk. You can use an IFileStore instance to create, delete, copy, move, or open streams on files. For a given URI, you can get your hands on an IFileStore instance using the static method EFS.getStore(URI)

The IFileSystem interface can be used to find out things about the file system as a whole. Each IFileSystem instance represents a single URI scheme, such as "file:", "ftp:", etc. You can use this type to ask questions such as what file attributes are supported, or whether the file system is case-sensitive. You can also use this type to obtain an IFileStore for a given URI.

Most methods on IFileStore have a flag parameter that allows extra options to be supplied. The flag values can be found in the EFS class. For example, to open an output stream for appending to a file, use:

	IFileStore store = ...//some file store
	store.openOutputStream(EFS.APPEND, null);

If you want the default behaviour for a method, use EFS.NONE.

The IFileInfo interface represents the state of a file at a particular moment in time. In particular, you can find out if the file exists, whether it is a directory, what its attributes are, and so on. This information can be modified and then set back into the file. For example, here is a snippet that sets the read only attribute on a directory:

	IFileStore store = ...//some file store
	IFileInfo info = store.fetchInfo();
	if (info.exists() && info.isDirectory()) {
		info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, true);
		store.putInfo(info, EFS.SET_ATTRIBUTES, null);
	}

This style of API allows you to obtain and change file information with a single call to the file system. In the above example, there is only one file system call to fetch the info, and then you can perform as many operations as you want on the IFileInfo object without hitting the disk again.

The EFS class has static factory methods for obtaining IFileStore and IFileSystem instances, as well as various option constants and error codes.