Mengapa akses ke jalan ditolak?

156

Saya mengalami masalah ketika saya mencoba menghapus file saya tetapi saya mendapatkan pengecualian.

if (result == "Success")
{
     if (FileUpload.HasFile)
     {
         try
         {
              File.Delete(Request.PhysicalApplicationPath + app_settings.login_images + txtUploadStatus.Text);
              string filename = Path.GetFileName(btnFileUpload.FileName);
              btnFileUpload.SaveAs(Request.PhysicalApplicationPath + app_settings.login_images + filename);
         }
         catch (Exception ex)
         {
               Message(ex.ToString());
         }
      }
}

Saya juga harus mencatat bahwa folder yang saya coba hapus memiliki kontrol penuh terhadap layanan jaringan.

Pesan pengecualian penuh adalah:

System.UnauthorizedAccessException: Akses ke jalur 'C: \ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg' ditolak. di System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) di System.IO.File.Delete (String path) di hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (pengirim objek, EventArg e) di C: \ Users \ gow Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs: baris 242

Ada ide?

nick gowdy
sumber
4
Apa yang tidak jelas tentang pengecualian? Akun tempat aplikasi ini berjalan tidak memiliki hak akses ke file / folder.
Oded
8
Saya mengerti apa yang dikatakan pengecualian. Masalahnya adalah fungsi ini digunakan oleh beberapa pengguna yang perlu memodifikasi gambar menggunakan sistem. Bagian dari itu adalah mengganti gambar dengan menghapus gambar lama dan menyimpan gambar baru.
nick gowdy
Periksa izin akses Anda ke folder. memberikan izin yang tepat ke folder menggunakan tab keamanan dari jendela properti
gasroot
6
Pengecualian tidak informatif sama sekali. Itu tidak memberi tahu Anda: A. Prinsipal apa yang mencoba mengakses sumber daya B. Izin apa yang dibutuhkannya. Untuk mengetahuinya, perlu menginstal Windows SysInternals dan memantau akses jalur.
ATL_DEV

Jawaban:

184

Menurut Metode File.Delete ...

Sebuah UnauthorizedAccessExceptioncara salah satu dari 4 hal:

  • Penelepon tidak memiliki izin yang diperlukan.
  • File adalah file yang dapat dieksekusi yang sedang digunakan.
  • Path adalah direktori.
  • Path menentukan file read-only.
CrazyTim
sumber
77
Path adalah direktori. Memalukan bagi saya: /
Per G
4
Terjadi pada saya kemarin facepalm . Saya benci pesan pengecualian ambigous ini :(
Broken_Window
1
Saya berjuang selama lebih dari 6 jam dan setelah melihat respons Anda melihat bahwa jalannya adalah direktori ... terima kasih banyak @CrazyTim ..
Pengguna M
6
Path is a directory.terima kasih atas tip ini :) Ini membantu saya.
Sidron
8
Oh my ... Path adalah direktori. Terima kasih Microsoft. Itu akses SANGAT tidak sah.
SeriousM
181

Saya juga punya masalah, maka saya tersandung pada posting ini. Saya menambahkan baris kode berikut sebelum dan sesudah Salin / Hapus.

Menghapus

File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);

Menyalin

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);
Riaan de Lange
sumber
17
Saya memberikan izin penuh 'Semua Orang' ke folder tanpa hasil. Entah bagaimana atribut file ini bekerja. Terima kasih. Saya berharap MS akhirnya akan memilih model keamanan yang tepat. Mencoba mencari tahu mengapa Copy / Delete meledak setiap beberapa tahun membuat frustrasi untuk sedikitnya.
Steve
13
SetAttributes Normal adalah trik untuk saya - Saya mencoba untuk File.Copy dan menimpa file read-only ..
Tom Hunter
6
Akses ke jalur ditolak tidak menyarankan bahwa file tersebut hanya dibaca saja (karena Anda memang memiliki akses ke jalur!) Menurut pendapat saya pesan kesalahan harus diubah. Terima kasih atas petunjuknya!
MBoros
1
Saya menjalankan program sebagai Administrator dan masalah itu hilang.
Santiago Villafuerte
5
Bagaimana pengaturan atribut setelah operasi penyalinan membantu? Bukankah program akan mogok pada pernyataan salinan? Haruskah sebelum operasi salin seperti operasi hapus?
Vibhore Tanwer
31

Ini adalah masalah lama, tetapi saya menabraknya saat mencari. Ternyata saya kehilangan komponen nama file yang sebenarnya di jalur penyimpanan untuk SaveAs ...

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD
Andrew Edvalson
sumber
18

Ketika pengguna mencoba terhubung ke situs Web Anda, IIS memberikan koneksi ke akun IUSER_ComputerName , di mana ComputerName adalah nama server tempat IIS berjalan. Secara default, akun IUSER_ComputerName adalah anggota grup Tamu. Grup ini memiliki batasan keamanan. Coba akses besar ke IUSER_ComputerName ke folder itu

Berikut ini jawaban yang dijelaskan dengan sangat baik tentang keamanan IIS

Semoga ini membantu

Arsen Mkrtchyan
sumber
Terima kasih ini membantu .. Izin untuk pengguna IIS_IUSRS.
Tom
13

Klik kanan pada Visual studio dan klik Jalankan sebagai Administrator

Alexander Zaldostanov
sumber
Ini adalah solusi untuk masalah File.Move saya pada mesin Windows 8.1 Enterprise di mana saya adalah administrator lokal, dan tidak ada lagi yang memiliki pegangan pada file.
Robert Kerr
13

Saya mendapatkan kesalahan karena saya tidak menyadari bahwa tujuan harus berupa file. Saya memiliki folder sebagai parameter kedua (yang berfungsi dalam cmd). dan saya dapatkan Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.karena C # File.Movemenginginkan file di sana, tidak hanya untuk parameter pertama, tetapi untuk yang kedua juga, dan jadi jika Anda meletakkan direktori sebagai parameter kedua, ia mencoba untuk menulis file seperti c:\crpketika Anda memiliki direktori bernama c:\crp.

ini akan salah File.Move(args[0],"c:\\crp");

Jadi, ini benar File.Move(args[0],"c:\\crp\\a.a");

Hal yang sama berlaku untuk File.Copy

barlop
sumber
1
Terima kasih! Ini secara tidak langsung memecahkan masalah di mana API mengharapkan tujuan yang saya berikan sebagai direktori, tidak menyadarinya harus menyertakan nama file (karena objek itu sendiri memiliki nama file terkait).
Austin Salgat
7

Jika ini adalah situs web IIS yang mengalami masalah, periksa properti Identity dari pengaturan lanjutan untuk kumpulan aplikasi yang digunakan situs atau aplikasi. Anda mungkin menemukan bahwa itu diatur ke ApplicationPoolIdentity, dan dalam hal ini maka ini adalah pengguna yang harus memiliki akses ke jalur.

Atau Anda bisa menggunakan gaya lama dan cukup mengatur Identity to Network Service, dan memberikan akses pengguna Layanan Jaringan ke jalur.

Bjørn Otto Vasbotten
sumber
3

Anda perlu mengubah hak istimewa folder yang Anda coba hapus dari / simpan ke. Klik kanan pada folder yang berisi dan gunakan tab Keamanan untuk mengizinkan hak memodifikasi untuk pengguna di mana aplikasi Anda berjalan.

Brissles
sumber
Anda mengasumsikan bahwa dia adalah admin mesinnya .. jika ini adalah mesin kerja dan dia hanya pengguna .. mereka mungkin mengatur izin seperti itu karena suatu alasan .. karena kita hanya dapat berasumsi
MethodMan
1
Ini adalah mesin kerja dan saya adalah pengguna yang kuat. Saya tidak masuk sebagai administrator. Properti folder gambar telah dimodifikasi sehingga layanan jaringan memiliki akses penuh. Tapi itu tidak ada bedanya.
nick gowdy
1
Saya baru saja menambahkan "Semua orang" dengan akses penuh ke folder, dan "voilá"
MarceloBarbosa
3

Pengecualian yang dilemparkan ketika sistem operasi menolak akses karena kesalahan I / O atau jenis kesalahan keamanan tertentu.

Saya memukul hal yang sama. Periksa untuk memastikan bahwa file tersebut TIDAK TERSEMBUNYI.

Ron H
sumber
3

Saya juga menghadapi masalah ini ketika layanan jendela saya mulai melempar pengecualian

System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.

Jadi sebagai solusi, saya memeriksa akun pengguna yang terkait dengan layanan saya, seperti yang ditunjukkan pada tangkapan layar di bawah ini

masukkan deskripsi gambar di sini

Jadi dalam kasus saya itu adalah LAYANAN JARINGAN

Dan kemudian pergi ke properti folder untuk memeriksa apakah akun pengguna terkait juga ada di bawah tab izin mereka. Itu hilang dalam kasus saya dan ketika saya menambahkannya dan itu memperbaiki masalah saya.

Untuk informasi lebih lanjut, silakan periksa tangkapan layar di bawah ini

masukkan deskripsi gambar di sini

Jitender Kumar
sumber
3

masalah yang sama bagi saya juga, saya menunjuk folder bukan file.

jadi pastikan di path, beri path + nama file

System.IO.File.WriteAllBytes("path", bytearray);
jineesh vp
sumber
2

Periksa properti file Anda. Jika read-only dicentang, hapus centang. Ini adalah masalah pribadi saya dengan UnauthorizedAccessException.

pengguna3238433
sumber
2

Saya mendapatkan kesalahan ini dan menyelesaikannya hanya dalam beberapa saat. Tidak tahu mengapa semua folder saya hanya-baca, saya membatalkan hanya-baca dan menerapkannya. Namun, ini masih bersifat read-only. Jadi saya memindahkan file ke folder root, itu berfungsi - sangat aneh.

Molly
sumber
2

Pengecualian UnauthorizedAccessException dilemparkan ketika sistem operasi menolak akses karena kesalahan I / O atau kesalahan keamanan.

Jika Anda mencoba mengakses file atau kunci registri, pastikan itu bukan hanya baca .

reza.Nikmaram
sumber
2

Jika Anda menggunakan BitDefender, ada kemungkinan besar fitur File Aman -nya memblokir operasi Anda. Ini adalah bentuk perlindungan Ransomware yang hadir dengan beberapa versi yang lebih canggih.

Pastikan untuk memberikan akses aplikasi Anda di BitDefender dan coba lagi.

Beberapa perincian lebih lanjut dapat ditemukan di halaman dukungan BitDefender ini .

Vlad Schnakovszki
sumber
1

Saya memiliki masalah yang sama pada situs web yang baru dipindahkan di server bersama. Diselesaikan melalui pengaturan panel host web (DotNetPanel) benar "izin izin tulis". Jadi jika Anda berada di server bersama sebelum meninjau semua kode, lihatlah konfigurasi server dan dapat menghemat banyak waktu.

Drakell
sumber
1

Perlu diketahui bahwa jika Anda mencoba untuk mencapai jalur folder bersama dari kode Anda, Anda tidak hanya perlu memberikan izin yang tepat ke folder fisik melalui tab keamanan. Anda juga perlu "berbagi" folder dengan pengguna kumpulan aplikasi yang sesuai melalui Tab Berbagi

Kacho
sumber
1

Saya menghadapi kesalahan ini karena

Kadang-kadang ketika saya Combineyang jalan dengan Nama File danFileName = ""

Itu menjadi Path Directorybukan filemasalah yang disebutkan di atas

jadi Anda harus memeriksa FileNameseperti ini

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));
Basheer AL-MOMANI
sumber
1

Saya memiliki kesalahan yang tepat ketika menghapus file. Itu adalah Layanan Windows yang berjalan di bawah Akun Layanan yang tidak dapat menghapus dokumen .pdf dari Folder Bersama walaupun itu memiliki Kontrol Penuh folder.

Apa yang berhasil bagi saya adalah menavigasi ke tab Keamanan di Folder Bersama> Lanjutan> Bagikan> Tambah.

Saya kemudian menambahkan akun layanan ke grup administrator, menerapkan perubahan dan akun layanan kemudian dapat melakukan semua operasi pada semua file dalam folder itu.

LUZZ
sumber
1

Bagi mereka yang mencoba membuat aplikasi UWP (Universal Windows), izin file jauh lebih terbatas, dan secara umum ditolak secara default. Ini juga menggantikan izin pengguna sistem. Anda pada dasarnya hanya akan memiliki akses ke file di salah satu

  • Lokasi instal Anda
  • Lokasi AppData Anda
  • File dipilih melalui pemilih File atau Folder
  • Lokasi yang diminta di Manifes Aplikasi Anda

Anda dapat membaca lebih lanjut di sini untuk perincian => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

Tezra
sumber
1

Dalam kasus saya masalahnya adalah Norton. Program in-house saya tidak memiliki tanda tangan digital yang tepat dan ketika mencoba menghapus file itu memberi UnauthorizedAccessException.

masukkan deskripsi gambar di sini

Jika memberi Anda pemberitahuan, Anda bisa mengatasinya dari sana. Dalam kasus saya itu tidak memberikan pemberitahuan yang saya perhatikan. Jadi, inilah cara mencegah Norton memblokir program.

  1. Buka Norton
  2. Klik panah bawah
  3. Klik Riwayat
  4. Temukan aktivitas dengan program
  5. Klik Opsi Lainnya
  6. Klik Kecualikan Proses
D_Bester
sumber
0

Saya juga menghadapi masalah yang sama ketika mencoba melakukan ini setelah ditempatkan di server:

dirPath = Server.MapPath(".") + "\\website\\" + strUserName;
if (!Directory.Exists(dirPath))
{
    DirectoryInfo DI = Directory.CreateDirectory(dirPath);
}
string filePath = Server.MapPath(".") + "\\Website\\default.aspx";
File.Copy(filePath, dirPath + "\\default.aspx", true);
File.SetAttributes(dirPath + "\\default.aspx", FileAttributes.Normal);

Saya memberikan izin dalam IIS ke grup lain termasuk administrator dan masalah saya terpecahkan.

Manish Singh
sumber
0

Saya telah menemukan bahwa kesalahan ini dapat terjadi pada DESIGN MODE sebagai lawan dari? mode eksekusi ... Jika Anda melakukan sesuatu seperti membuat anggota kelas yang memerlukan akses ke file .INI atau .HTM (file konfigurasi, file bantuan), Anda mungkin TIDAK ingin menginisialisasi item dalam deklarasi, tetapi inisialisasi nanti di FORM_Load () dll ... Ketika Anda DO menginisialisasi ... Gunakan pernyataan penjaga IF:

    /// <summary>FORM: BasicApp - Load</summary>
    private void BasicApp_Load(object sender, EventArgs e)
    {
        // Setup Main Form Caption with App Name and Config Control Info
        if (!DesignMode)
        {
            m_Globals = new Globals();
            Text = TGG.GetApplicationConfigInfo();
        }
    }

Ini akan menjaga MSVS Designer dari mencoba membuat file INI atau HTM ketika Anda berada dalam mode desain.

Terry
sumber
0

Saya memiliki kesalahan ini ketika saya mencoba untuk mengganti nama folder dengan sangat cepat setelah dipindahkan atau dibuat.

Sederhana System.Threading.Thread.Sleep(500);menyelesaikannya:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}
Arjan de Bruijn
sumber
Berpikir akan lebih baik jika Anda memeriksa apakah folder itu ada sebelum memindahkannya daripada tidur selama setengah detik ... jika OS sedang sibuk langkah sebelumnya mungkin memakan waktu lebih dari setengah detik, dan Anda kembali ke masalah yang sama.
Paul Zahra
Sepotong kode ini sangat berbahaya. Itu mengulangi metode RenameFile tidak peduli apa pengecualian yang dilemparkan! Ini bisa menyebabkan aplikasi mogok jika penyebab pengecualian adalah masalah izin aktual
Hossein Shahdoost
0

Dalam kasus khusus saya, saya berulang kali membuat dan menghapus 10.000 folder. Tampak bagi saya bahwa masalahnya adalah meskipun metode Directory.Delete(path, true)kembali, mekanisme OS bawahan mungkin masih menghapus file dari disk. Dan ketika saya mulai membuat folder baru segera setelah penghapusan yang lama, beberapa dari mereka masih terkunci karena belum sepenuhnya dihapus. Dan saya mendapatkan System.UnauthorizedAccessException: "Akses ke jalan ditolak".

masukkan deskripsi gambar di sini

Menggunakan Thread.Sleep(5000)setelah Directory.Delete(path, true)memecahkan masalah itu. Saya sepenuhnya setuju bahwa ini tidak aman, dan saya tidak mendorong siapa pun untuk menggunakannya. Saya akan senang di sini pendekatan yang lebih baik untuk memecahkan masalah ini untuk meningkatkan jawaban saya. Sekarang saya hanya memberikan ide mengapa pengecualian ini dapat terjadi.

class Program
{
    private static int numFolders = 10000;
    private static string rootDirectory = "C:\\1";

    static void Main(string[] args)
    {
        if (Directory.Exists(rootDirectory))
        {
            Directory.Delete(rootDirectory, true);
            Thread.Sleep(5000);
        }

        Stopwatch sw = Stopwatch.StartNew();
        CreateFolder();
        long time = sw.ElapsedMilliseconds;

        Console.WriteLine(time);
        Console.ReadLine();
    }

    private static void CreateFolder()
    {
        var one = Directory.CreateDirectory(rootDirectory);

        for (int i = 1; i <= numFolders; i++)
        {
            one.CreateSubdirectory(i.ToString());
        }
    }
}
Aleksei Mialkin
sumber
0

Pertama-tama, periksa lintasan apakah karakter titik dua (:) tidak ada atau tidak setelah huruf drive. Jika titik dua tidak hilang maka Anda dapat memeriksa apakah izin akses / tulis diberikan untuk jalur itu. Saya memiliki masalah yang sama dan saya hanya kehilangan usus besar, izin dan yang lainnya baik-baik saja.

C:\folderpath

akan bekerja dengan baik tetapi,

C\folderpath .........(missing colon)

akan memberi Anda kesalahan penolakan akses.

Vijay Dodamani
sumber
0

Saya mencoba menggunakan System.IO.File.OpenWrite (path)

dan itu tidak berhasil karena saya hanya melewatkan OpenWrite () path ke direktori, tetapi membutuhkan path sampai ke file yang ingin Anda tulis. Jadi path lengkap termasuk filename.extension pada akhirnya perlu diteruskan ke OpenWrite untuk menghindari UnauthorizedAccessException

SeanMC
sumber
0

Saya juga berlari ke posting ini karena berurusan dengan masalah yang sama. Sepertinya file sedang digunakan dan karenanya tidak dapat menulis ke sana. Meski tidak bisa mengetahuinya, proses mana yang menggunakannya. Keluar dari pengguna lain yang masuk di kotak itu, jangan melihat pengguna yang memegangnya. Kiat singkat tentang cara menemukan yang sama.

Terima kasih, Lakshay (pengembang)

Lakshay Gupta
sumber
Di jawaban Anda jangan memposting pertanyaan baru, tetapi cobalah untuk menjawab pertanyaan dari pengirim asli dengan informasi yang bermanfaat. Untuk pertanyaan Anda sendiri, cari stackoverflow terlebih dahulu untuk pertanyaan yang sama atau serupa. Jika Anda tidak menemukan apa pun, poskan pertanyaan baru mengikuti panduan ini: Cara mengajukan pertanyaan yang bagus
alev
0

Untuk mengatasi masalah ini, saya mengikuti pendekatan Scot Hanselman di Sistem Debugging. Tidak DiotorisasiAccessException (sering diikuti oleh: Akses ke jalur ditolak) artikel, kode dengan contoh di bawah ini:

class Program
{
    static void Main(string[] args)
    {
        var path = "c:\\temp\\notfound.txt";
        try
        {
            File.Delete(path);
        }
        catch (UnauthorizedAccessException)
        {
            FileAttributes attributes = File.GetAttributes(path);
            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                attributes &= ~FileAttributes.ReadOnly;
                File.SetAttributes(path, attributes);
                File.Delete(path);
            }
            else
            {
                throw;
            }
        }
    }
}
Antonio Leonardo
sumber