Show More
@@ -362,7 +362,36 b' def opener(base):' | |||
|
362 | 362 | remote file access from higher level code. |
|
363 | 363 | """ |
|
364 | 364 | p = base |
|
365 | def o(path, mode="r", text=False): | |
|
365 | ||
|
366 | def mktempcopy(name): | |
|
367 | d, fn = os.path.split(name) | |
|
368 | fd, temp = tempfile.mkstemp(prefix=fn, dir=d) | |
|
369 | fp = os.fdopen(fd, "wb") | |
|
370 | try: | |
|
371 | fp.write(file(name, "rb").read()) | |
|
372 | except: | |
|
373 | try: os.unlink(temp) | |
|
374 | except: pass | |
|
375 | raise | |
|
376 | fp.close() | |
|
377 | st = os.lstat(name) | |
|
378 | os.chmod(temp, st.st_mode) | |
|
379 | return temp | |
|
380 | ||
|
381 | class atomicfile(file): | |
|
382 | """the file will only be copied on close""" | |
|
383 | def __init__(self, name, mode, atomic=False): | |
|
384 | self.__name = name | |
|
385 | self.temp = mktempcopy(name) | |
|
386 | file.__init__(self, self.temp, mode) | |
|
387 | def close(self): | |
|
388 | if not self.closed: | |
|
389 | rename(self.temp, self.__name) | |
|
390 | file.close(self) | |
|
391 | def __del__(self): | |
|
392 | self.close() | |
|
393 | ||
|
394 | def o(path, mode="r", text=False, atomic=False): | |
|
366 | 395 | f = os.path.join(p, path) |
|
367 | 396 | |
|
368 | 397 | if not text: |
@@ -376,21 +405,10 b' def opener(base):' | |||
|
376 | 405 | if not os.path.isdir(d): |
|
377 | 406 | os.makedirs(d) |
|
378 | 407 | else: |
|
408 | if atomic: | |
|
409 | return atomicfile(f, mode) | |
|
379 | 410 | if nlink > 1: |
|
380 | d, fn = os.path.split(f) | |
|
381 | fd, temp = tempfile.mkstemp(prefix=fn, dir=d) | |
|
382 | fp = os.fdopen(fd, "wb") | |
|
383 | try: | |
|
384 | fp.write(file(f, "rb").read()) | |
|
385 | except: | |
|
386 | try: os.unlink(temp) | |
|
387 | except: pass | |
|
388 | raise | |
|
389 | fp.close() | |
|
390 | st = os.lstat(f) | |
|
391 | os.chmod(temp, st.st_mode) | |
|
392 | rename(temp, f) | |
|
393 | ||
|
411 | rename(mktempcopy(f), f) | |
|
394 | 412 | return file(f, mode) |
|
395 | 413 | |
|
396 | 414 | return o |
General Comments 0
You need to be logged in to leave comments.
Login now