Piszę trochę Perla, który bierze programy telewizyjne nagrane w Windows Media Center i przenosi/zmienia nazwy/usuwa je w zależności od pewnych kryteriów.Określić, czy plik jest używany w Perlu na Windows
Ponieważ Perl działa dość często, chciałbym czyściutko określić, czy plik jest w użyciu (innymi słowy, program jest w trakcie rejestrowania), dzięki czemu mogę uniknąć robienia czegokolwiek z nim.
Mój obecny sposób patrzy na status pliku (za pomocą „stat”) i porównuje go ponownie po upływie 5 sekund, tak jak poniżej:
sub file_in_use
{
my $file = shift;
my @before = stat($file);
sleep 5;
my @after = stat($file);
return 0 if ($before ~~ $after);
return 1;
}
wydaje się działać, ale jestem świadomy, że istnieje jest prawdopodobnie lepszym i czystszym sposobem na zrobienie tego.
Czy możesz doradzić?
To jest w porządku approch do niego i Nie wierzę, że znajdziesz wiele opcji w pobliżu ... inny sposób robienia tego będzie polegał na czytaniu pid aplikacji i przenoszeniu plików po pidzie ... – Prix
Od Prix (myślę, że to ważne, żeby wskazać out): * Jeśli plik jest używany w pełnym wymiarze godzin i nie został zwolniony, nie można wykonać przeniesienia [lub usunięcia] pliku, ponieważ spowoduje to błąd ... *. (Kopia może działać w zależności od różnych ustawień trybu plików.) Nawet z podejściem stat, musisz * nadal * obsługiwać scenariusz FS i używać 'file_in_use' tylko jako" podpowiedź "(chociaż potencjalne warunki wyścigu mogą się nigdy nie zmaterializować tutaj). –
@ pst Prawda, dlatego uważam, że przenoszenie to dobra droga ... ponieważ jeśli plik jest nadal zablokowany, to albo zwróci 0, albo powie ci błąd w zależności od tego, jak go kodujesz i możesz próbować do jest wydany lub ... – Prix