private final Path getPathFunc(final String[] names, int offset) {
		Path p = this;
		for (int i = offset; i < names.length; ++i) {
			final String name = names[i];
			final PathReference pWeak;
			if (name.startsWith(".")) {
				if (name.equals(".")) {
					continue;
				} else if (name.equals("..")) {
					if (p.parent == null) {
						continue;
					}
					p = p.parent;
					continue;
				}
			} else {
				final Path pTmp = rootMap.get(name);
				if (pTmp != null) {
					p = pTmp;
					continue;
				}
			}
			final Path pTmp;
			synchronized (Path.finalizerMonitor) {
				pWeak = p.successors.get(name);
				if (pWeak == null) {
					return new Path(p, names, i);
				}
				pTmp = pWeak.get();
				if (pTmp == null) {
					return new Path(p, names, i);
				}
			}
			p = pTmp;
		}
		return p;
	}