public final boolean add(CMVFSFile f)
		{
			int x=f.path.lastIndexOf('/');
			if(x==f.path.length()-1)
				x=f.path.lastIndexOf('/',x-1);
			CMVFSDir subDir=this;
			if((x>0)&&(!f.path.substring(0,x+1).equals(path)))
				subDir=fetchSubDir(f.path.substring(0,x),true);
			if(subDir!=null)
			synchronized(subDir)
			{
				if(subDir.files==null)
					subDir.files=new CMVFSFile[0];
				final CMVFSFile old = subDir.get(f);
				if(old!=null)
					f.copyInto(old);
				else
				{
					subDir.files=Arrays.copyOf(subDir.files, subDir.files.length+1);
					if(CMath.bset(f.mask, CMFile.VFS_MASK_DIRECTORY))
					{
						if(!(f instanceof CMVFSDir))
						{
							final CMVFSDir d = new CMVFSDir(subDir,f.path,f.mask,f.modifiedDateTime,f.author);
							f.copyInto(d);
							f=d;
						}
					}
					subDir.files[subDir.files.length-1]=f;
				}
				Arrays.sort(subDir.files,fcomparator);
			}
			else
				return false;
			return true;
		}