Monday, November 08, 2010 at 12:02 AM.


on filteredCopy (sourcepath, destpath, filter) {
	<<3.0.2: kernel now supports copying of folders themselves, retaining attributes or original
	local (pathchar = file.getPathChar ()); <<DW 11/3/97
	on kernelcall (sourcepath, destpath) {
		kernel (file.copy)};
	on copyonefile (sourcepath, destpath) {
		if not filter^ (sourcepath) { <<the filter says don't copy this file
			return (true)};
		sys.systemTask (); <<be extra sensitive to user input, other application tasks
		return (kernelcall (sourcepath, destpath))};
	if file.isFolder (sourcepath) { <<copying a folder
		local (topdest = destpath); <<a global to the whole copying process
		on foldercopy (folderpath, partialpath) {
			local (f, newfolder);
			if not filter^ (folderpath) { <<the filter says don't copy this folder
				return (true)};
			newfolder = topdest + partialpath;
			bundle { <<do folder checking
				if file.exists (newfolder) {
					if not file.isFolder (newfolder) {
						scriptError ("Can't copy because " + newfolder + " is a file, not a folder.");
						return (false)}}
				else { <<new folder doesn't exist, try to create it
					if not kernelcall (folderpath, newfolder) {
						return (false)};
					newfolder = filespec (newfolder)}}; <<in case caller omitted trailing pathchar
			fileloop (f in folderpath) {
				rollBeachBall ();
				if file.isFolder (f) {
					if not foldercopy (f, partialpath + file.fileFromPath (f)) { <<recurse
						return (false)}}
				else {
					if not copyonefile (f, newfolder + file.fileFromPath (f)) {
						return (false)}}}};
		return (foldercopy (sourcepath, ""))}
	else { <<just copying a file
		if string.hasSuffix (pathchar, destpath) {
			if not file.isFolder (destpath) {
				scriptError ("Can't copy the file into \"" + destpath + "\" because it is not a folder.")};
			destpath = destpath + file.fileFromPath (sourcepath)}
		else {
			if file.exists (destpath) and file.isFolder (destpath) {
				scriptError ("Can't copy the file as \"" + destpath + "\" because there is a folder at that location.")}};
		return (copyonefile (sourcepath, destpath))}}

This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.