def copy(self, source, destination): # Prepare the source path for XRootD if not self._parse_url(source): source = abspath(source) else: domain, dirname, filename = self._parse_url(source) source = f"{domain}/{dirname}/{filename}" # Prepare the destination path for XRootD assert os.path.basename(source) == os.path.basename(destination) if self._parse_url(destination): domain, dirname, filename = self._parse_url(destination) destination = f"{domain}/{dirname}/{filename}" self.makedirs(domain, dirname) else: destination = abspath(destination) if not os.path.isdir(os.path.dirname(destination)): os.makedirs(os.path.dirname(destination)) # Perform the copy operation process = client.CopyProcess() process.add_job(source, destination, force=True) process.prepare() status, returns = process.run() if not status.ok or not returns[0]["status"].ok: raise XRootDFileException( "Error copying from " + source + " to " + destination, repr(status), repr(returns), )
def mtime(self): if self.exists(): return self._xrd.file_last_modified(self.remote_file()) else: raise XRootDFileException( "The file does not seem to exist remotely: %s" % self.remote_file() )
def remove(self, url): domain, dirname, filename = self._parse_url(url) filename = join(dirname, filename) status, _ = self.get_client(domain).rm(filename) if not status.ok: raise XRootDFileException( 'Failed to remove file '+filename+' from remote '+domain+'\n'+repr(status))
def makedirs(self, domain, dirname): print("Making directories", domain, dirname) assert dirname.endswith("/") status, _ = self.get_client(domain).mkdir(dirname, MkDirFlags.MAKEPATH) if not status.ok: raise XRootDFileException("Failed to create directory " + dirname, repr(status))
def list_directory(self, domain, dirname): status, dirlist = self.get_client(domain).dirlist(dirname, DirListFlags.STAT) if not status.ok: raise XRootDFileException( 'Error listing directory '+dirname+' on domain '+domain+ '\n'+repr(status)+'\n'+repr(dirlist) ) return dirlist.dirlist
def exists(self, url): domain, dirname, filename = self._parse_url(url) status, dirlist = self.get_client(domain).dirlist(dirname) if not status.ok: if status.errno == 3011: return False else: raise XRootDFileException( 'Error listing directory '+dirname+' on domain '+domain+ '\n'+repr(status)+'\n'+repr(dirlist)) return filename in [f.name for f in dirlist.dirlist]
def exists(self, url): domain, dirname, filename = self._parse_url(url) status, statInfo = self.get_client(domain).stat(os.path.join(dirname, filename)) if not status.ok: if status.errno == 3011: return False raise XRootDFileException( "Error stating URL " + os.path.join(dirname, filename) + " on domain " + domain + "\n" + repr(status) + "\n" + repr(statInfo) ) return True