Entah bagaimana, salah satu kotak Server 2008 kami yang lama (bukan R2) telah mengembangkan folder yang tampaknya berulang sekali. Ini bermain havock dengan cadangan kami, karena agen cadangan mencoba untuk kembali ke folder dan tidak pernah kembali.
Struktur folder terlihat seperti:
C:\Storage\Folder1
C:\Storage\Folder1\Folder1
C:\Storage\Folder1\Folder1\Folder1
C:\Storage\Folder1\Folder1\Folder1\Folder1
... dan seterusnya. Ini seperti salah satu set Mandelbrot yang kami gunakan untuk semua bermain di tahun 90-an.
Saya sudah mencoba:
- Menghapusnya dari Explorer. Ya, saya optimis.
RMDIR C:\Storage\Folder1 /Q/S
- ini kembaliThe directory is not empty
ROBOCOPY C:\temp\EmptyDirectory C:\Storage\Folder1 /PURGE
- ini berputar melalui folder selama beberapa menit sebelum robocopy.exe macet.
Adakah yang bisa menyarankan cara untuk mematikan folder ini untuk selamanya?
/MIR
sebagai gantinya:ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
juga mungkin layak dijalankanchkdsk
hanya untuk cekikikan./MIR
tampaknya bertahan lebih lama, tetapi akhirnya dibom juga ("robocopy telah berhenti bekerja"). Saya agak takut melakukanchkdsk
; ini adalah server yang cukup lama dan saya khawatir masalah ini menunjukkan masalah sistem file yang lebih besar ...find
untuk melakukan penghapusan direktori pertama yang dalam:find Storage/Folder1 -depth -exec rmdir {} \;
Jawaban:
Terima kasih kepada semua orang atas saran yang bermanfaat.
Menyasar jauh ke wilayah StackOverflow, saya telah memecahkan masalah dengan mengetuk potongan kode C # ini. Ini menggunakan perpustakaan Delimon.Win32.IO yang secara khusus mengatasi masalah mengakses jalur file panjang.
Untuk berjaga-jaga kalau ini bisa membantu orang lain, inilah kodenya - kode itu berhasil melewati ~ 1600 tingkat rekursi yang entah bagaimana membuat saya terjebak dan butuh sekitar 20 menit untuk menghapus semuanya.
sumber
.Delete
(bukanSystem.IO
versi normal ), dan meskipun tidak membuang pengecualian, sepertinya tidak melakukan apa-apa. Tentu saja rekursi menggunakan metode di atas memakan waktu lama, dan.Delete
hanya mengunyah selama 5-10 detik. Mungkin itu terkelupas di beberapa direktori dan kemudian menyerah?Bisa menjadi titik persimpangan rekursif. Hal seperti itu dapat dibuat dengan
junction
utilitas file dan disk dari Sysinternals .Dan sekarang Anda dapat turun tanpa henti c: \ Hello \ Hello \ Hello .... (hingga MAX_PATH tercapai, 260 karakter untuk sebagian besar perintah, tetapi 32.767 karakter untuk beberapa fungsi Windows API).
Daftar direktori menunjukkan bahwa ini adalah persimpangan:
Untuk menghapus gunakan utilitas persimpangan:
sumber
DIR
hanya menunjukkan saya direktori ole biasa - tidak ada tanda-tanda persimpangan saya khawatirjunction -s C:\Storage\Folder1
?No reparse points found
:(dir /a
untuk melihat '<JUNCTION>' tanpa menentukan nama spesifik.Bukan jawaban, tapi saya tidak punya cukup perwakilan untuk komentar.
Saya pernah memperbaiki masalah ini pada disk FAT16 500MB pada sistem MS-DOS. Saya menggunakan DOS debug untuk secara manual membuang dan mem-parsing melalui tabel direktori. Saya kemudian membalik sedikit untuk menandai direktori rekursif sebagai dihapus. Salinan 'Referensi Programmer' DOS Dettman dan Wyatt saya menunjukkan caranya.
Saya masih sangat bangga akan hal ini. Saya akan kagum dan ketakutan jika ada alat serba guna yang memiliki kekuatan lebih dari volume FAT32 atau NTFS. Hidup lebih sederhana saat itu.
sumber
Java juga dapat menangani jalur file yang panjang. Dan itu juga bisa lebih cepat. Kode ini (yang saya salin dari dokumentasi Java API) akan menghapus struktur direktori sedalam 1600 level dalam waktu sekitar 1 detik (di bawah Windows 7, Java 8.0) dan tanpa risiko stack overflow karena tidak benar-benar menggunakan rekursi.
sumber
Anda tidak perlu nama path panjang jika
chdir
masuk ke direktori dan cukup gunakan path relatif kermdir
.Atau, jika Anda memiliki shell POSIX yang diinstal, atau port ini ke setara DOS:
(Menggunakan variabel shell untuk melacak di mana Anda mengganti nama untuk kondisi loop adalah alternatif lain untuk membuka gulungan loop seperti yang saya lakukan di sana.)
Ini menghindari overhead CPU dari solusi KenD, yang memaksa OS untuk melintasi pohon dari atas ke
n
tingkat th setiap kali level baru ditambahkan, memeriksa izin dll. Sehingga memilikisum(1, n) = n * (n-1) / 2 = O(n^2)
kompleksitas waktu. Solusi yang memotong sebagian dari awal rantai seharusnyaO(n)
, kecuali Windows perlu melintasi pohon ketika mengganti nama direktori induknya. (Linux / Unix tidak.) Solusi yangchdir
semuanya turun ke bawah pohon dan menggunakan jalur relatif dari sana, menghapus direktori saatchdir
dicadangkan, juga harusO(n)
, dengan asumsi OS tidak perlu memeriksa semua Anda direktori induk setiap panggilan sistem, ketika Anda melakukan hal-hal saat CD di suatu tempat.find Folder1 -depth -execdir rmdir {} +
akan menjalankan rmdir saat CD ke direktori terdalam. Atau sebenarnya,-delete
opsi find berfungsi pada direktori, dan tersirat-depth
. Jadifind Folder1 -delete
harus melakukan hal yang persis sama, tetapi lebih cepat. Ya, GNU temukan di Linux turun dengan memindai direktori, memindahkan CD ke subdirektori dengan jalur relatif, lalurmdir
dengan jalur relatif, laluchdir("..")
. Itu tidak memindai ulang direktori saat naik, sehingga akan mengkonsumsiO(n)
RAM.Itu benar-benar sebuah pendekatan:
strace
menunjukkan itu SEBENARNYA menggunakanunlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
,open("..", O_DIRECTORY|...)
danfchdir(the fd from opening the directory)
, dengan sekelompokfstat
panggilan dicampur dalam, juga. Tetapi efeknya sama jika pohon direktori tidak dimodifikasi saat find sedang berjalan.sunting: Hanya untuk iseng, saya mencoba ini pada GNU / Linux (Ubuntu 14.10, pada Core2Duo CPU generasi pertama 2.4GHz, pada sistem file XFS pada WD 2.5TB Green Power drive (WD25EZRS)).
(mkdir -p membuat direktori dan komponen path yang hilang).
Ya, benar-benar 0,05 detik untuk operasi 2k rmdir. xfs cukup bagus dalam batching operasi metadata bersama dalam jurnal, karena mereka memperbaiki operasi data meta yang lambat seperti 10 tahun yang lalu.
Pada ext4, buat take 0m0.279s, hapus dengan find masih butuh 0m0.074s.
sumber
Saya memang mengalami masalah yang sama dengan kekacauan folder direktori sedalam 5000+ yang dilakukan oleh beberapa aplikasi Java dan saya menulis sebuah program yang akan membantu Anda menghapus folder ini. Seluruh kode sumber ada di tautan ini:
https://imanolbarba.net/gitlab/imanol/DiREKT
Ini menghapus semuanya setelah beberapa saat, tetapi berhasil melakukan pekerjaan, saya harap itu membantu orang-orang yang (seperti saya), mengalami masalah yang sama membuat frustrasi
sumber
Saya juga punya ini, pada sistem Windows 10 mandiri sekalipun. C: \ Pengguna \ Nama \ Ulangi \ Ulangi \ Ulangi \ Ulangi \ Ulangi \ Ulangi yang tampaknya tak terhingga.
Saya dapat menavigasi menggunakan Windows atau Command Prompt ke yang ke 50 dan tidak lebih lanjut. Saya tidak bisa menghapusnya, atau mengkliknya, dll.
C adalah bahasa saya jadi akhirnya saya menulis sebuah program dengan loop panggilan sistem, yang diulang sampai gagal. Anda bisa melakukan ini dalam bahasa apa pun, bahkan batch DOS. Saya membuat direktori bernama tmp dan memindahkan Repeat \ Repeat ke dalamnya, menghapus folder Repeat yang sekarang kosong, dan memindahkan tmp \ Repeat kembali ke folder saat ini. Lagi dan lagi!
ChkSystem hanya menjalankan panggilan sistem () dan memeriksa nilai balik, berhenti jika gagal.
Yang penting, itu gagal beberapa kali. Saya pikir mungkin program saya tidak berfungsi, atau program itu lama sekali. Namun, saya pernah mengalami ini sebelumnya dengan pemanggilan sistem, dengan hal-hal yang tidak disinkronkan, jadi saya hanya menjalankan program lagi dan melanjutkan dari tempat sebelumnya, jadi jangan langsung berpikir program Anda tidak berfungsi. Jadi secara total, setelah menjalankannya sekitar 20 kali, itu membersihkan mereka semua. Secara total, awalnya sekitar 1.280 folder. Tidak tahu apa yang menyebabkannya. Gila.
sumber