簡體   English   中英

檢測正在將文件復制到文件夾中

[英]Detecting that files are being copied in a folder

我正在運行一個腳本,如果它不存在(或不一致),則從特定位置復制一個文件夾。 當我多次運行腳本2次以上時會出現問題。 當第一個腳本試圖復制文件時,第二個腳本會嘗試同樣的事情導致一團糟。 我怎么能避免這種情況? 類似於系統范圍的互斥體。

我用-w嘗試了一個簡單的測試,我手動復制了文件夾,當文件夾復制時我運行腳本:

use strict;
use warnings;

my $filename = 'd:\\folder_to_copy';
if (-w $filename) {
  print "i can write to the file\n";
} else {
  print "yikes, i can't write to the file!\n";
}

當然這不起作用,因為我仍然有寫入該文件夾的訪問權限。 任何想法如何檢查文件夾是否在Perl中復制或使用batch commands

聽起來像鎖文件的工作 有無數的CPAN模塊可以實現鎖定文件,但大多數都不能在Windows上運行。 根據CPAN測試人員,以下是一些似乎支持Windows的方法:

在快速查看源代碼后,我可以推薦的唯一模塊是File :: Flock :: Tiny 其他人似乎很生氣。

如果你需要一個系統范圍的互斥鎖,那么一個“技巧”是(ab)使用一個目錄。 命令mkdir通常是原子的,可以工作也可以不工作(如果目錄已經存在)。

更改腳本如下:

my $mutex_dir = '/tmp/my-mutex-dir';
if ( mkdir $mutex_dir ) {

    # run your copy-code here

    # when finished:
    rmdir $mutex_dir;
} else {
    print "another instance is already running.\n";
}

您唯一需要確保的是,您可以在/tmp (或其中)創建目錄。

請注意,我故意首先測試$mutex_dir的存在,因為在if (not -d $mutex_dir)mkdir其他人可以創建目錄,而mkdir無論如何都會失敗。 所以簡單地調用mkdir 如果它工作,那么你可以做你的東西。 完成后不要忘記刪除$mutex_dir

這也是這種方法的缺點:如果您的復制代碼崩潰並且腳本過早死亡,那么該目錄不會被刪除。 據推測,在nwellnhof的答案中建議的鎖定文件機制在這種情況下表現得更好,並自動解鎖文件。

當第一個腳本試圖復制文件時,第二個腳本會嘗試同樣的事情導致一團糟

最簡單的方法是創建一個文件,如果另一個腳本實例正在運行,該文件將包含1。 然后,您可以添加條件。

{local $/; open my $fh, "<", 'flag' or die $!; $data = <$fh>};
die "another instance of script is running" if $data == 1;

另一種方法是在腳本中設置環境變量並在BEGIN塊中檢查它。

您可以使用包http://search.cpan.org/~cjm/Win32-IPC-1.11/的 Windows-Mutex或Windows-Semaphore對象

use Win32::Mutex;
use Digest::MD5 qw (md5_hex);
my $mutex = Win32::Mutex->new(0, md5_hex $filename);
if ($mutex) {
     do_your_job();
     $mutex->release
} else {
     #fail...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM