public FileFAT(FileSystemFAT fileSystem, FolderFAT.DirectoryEntry entry, string path) {
			FileSystem = fileSystem;
			Name = PathUtils.MakeFileNameValid(entry.FileName);
			Path = PathUtils.Combine(path, Name);
			_length = entry.Length;
			Attributes = new FileAttributesFAT(entry);
			FirstCluster = entry.ClusterNum;
			Deleted = Attributes.Deleted;
		}
		public FileFAT(FileSystemFAT fileSystem, long firstCluster) {
			FileSystem = fileSystem;
			FirstCluster = firstCluster;
			Name = Util.GetRandomString(8);
			Path = PathUtils.Combine(FileSystem.Store.DeviceID, "?", Name);
			long currentCluster = FirstCluster;
			_length = 0;
			while (currentCluster >= 0) {
				// Note: This won't correctly calculate the length of a deleted file.
				currentCluster = FileSystem.GetNextCluster(currentCluster);
				_length += FileSystem.BytesPerCluster;
			}
			Attributes = new FileAttributesFAT();
			Deleted = true;
		}
		public FolderFAT(FileSystemFAT fileSystem, long offset, long cluster) {
			_root = true;
			Offset = offset;
			FileSystem = fileSystem;
			FirstCluster = cluster;
			Name = GetVolumeName();
			Path = FileSystem.Store.DeviceID;
			Loaded = false;
			Attributes = new FileAttributesFAT();
			Deleted = Attributes.Deleted;
		}
		public FolderFAT(FileSystemFAT fileSystem, DirectoryEntry entry, string path) {
			_root = false;
			FileSystem = fileSystem;
			Offset = entry.Offset;
			FirstCluster = entry.ClusterNum;
			Name = PathUtils.MakeFileNameValid(entry.FileName);
			Path = PathUtils.Combine(path, Name);
			Loaded = false;
			Attributes = new FileAttributesFAT(entry);
			Deleted = Attributes.Deleted;
		}
			public DirectoryEntry(FileSystemFAT fileSystem, long offset) {
				byte[] data = fileSystem.Store.GetBytes((ulong)offset, DIR_ENTRY_SIZE);
				DIR_Name = ASCIIEncoding.ASCII.GetString(data, 0, 11);
				DIR_Attr = (FATDirectoryAttributes)data[11];
				DIR_NTRes = data[12];
				DIR_CrtTimeTenth = data[13];
				DIR_CrtTime = BitConverter.ToUInt16(data, 14);
				DIR_CrtDate = BitConverter.ToUInt16(data, 16);
				DIR_LstAccDate = BitConverter.ToUInt16(data, 18);
				DIR_FstClusHI = BitConverter.ToUInt16(data, 20);
				DIR_WrtTime = BitConverter.ToUInt16(data, 22);
				DIR_WrtDate = BitConverter.ToUInt16(data, 24);
				DIR_FstClusLO = BitConverter.ToUInt16(data, 26);
				DIR_FileSize = BitConverter.ToUInt32(data, 28);

				Free = data[0] == 0x0 || data[0] == 0x05 || data[0] == 0xE5;
				Last = data[0] == 0x0;
				string filename = DIR_Name.Substring(0, 8).Trim().ToLower();
				string ext = DIR_Name.Substring(8).Trim().ToLower();
				FileName = filename;
				if (ext != "") {
					if ((Attributes & FATDirectoryAttributes.ATTR_VOLUME_ID) == 0) {
						FileName += ".";
					}
					FileName += ext;
				}
				Offset = fileSystem.GetDiskOffsetOfFATCluster(ClusterNum);

				if (LongNameEntry) {
					LongName = string.Concat(Encoding.Unicode.GetString(data, 1, 10),
																	 Encoding.Unicode.GetString(data, 14, 12),
																	 Encoding.Unicode.GetString(data, 28, 4));
				}
			}