Tại sao truy cập vào đường dẫn bị từ chối?


156

Tôi đang gặp vấn đề trong đó tôi đang cố xóa tệp của mình nhưng tôi gặp ngoại lệ.

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());
         }
      }
}

Ngoài ra tôi nên lưu ý rằng thư mục tôi đang cố xóa từ đó có toàn quyền kiểm soát các dịch vụ mạng.

Thông báo ngoại lệ đầy đủ là:

System.UnauthorizedAccessException: Truy cập vào đường dẫn 'C: \ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Project \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg' bị từ chối. tại System.IO .__ Error.WinIOError (Int32 errorCode, String mightFullPath) tại System.IO.File.Delete (String path) tại hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (Object) Tài liệu \ Visual Studio 2008 \ Project \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs: dòng 242

Có ý kiến ​​gì không?


4
Điều gì không rõ ràng về ngoại lệ? Tài khoản mà ứng dụng đang chạy không có quyền truy cập vào tệp / thư mục.
Oded

8
Tôi hiểu những gì ngoại lệ đang nói. Vấn đề là chức năng này được sử dụng bởi một số người dùng cần sửa đổi hình ảnh bằng hệ thống. Một phần trong đó là thay thế hình ảnh bằng cách xóa hình ảnh cũ và lưu hình ảnh mới.
nick gowdy

Kiểm tra quyền truy cập của bạn vào thư mục. cấp quyền thích hợp cho thư mục bằng tab bảo mật từ cửa sổ thuộc tính
gasroot

6
Ngoại lệ không có nhiều thông tin. Nó không cho bạn biết: A. Hiệu trưởng nào đang cố truy cập vào tài nguyên B. Cần có sự cho phép nào. Để tìm hiểu, nó yêu cầu cài đặt Windows SysIternals và theo dõi truy cập đường dẫn.
ATL_DEV

Câu trả lời:


184

Theo phương pháp File.Delete ...

An UnauthorizedAccessExceptioncó nghĩa là một trong 4 điều:

  • Người gọi không có sự cho phép cần thiết.
  • Các tập tin là một tập tin thực thi đang được sử dụng.
  • Đường dẫn là một thư mục.
  • Đường dẫn chỉ định một tệp chỉ đọc.

76
Đường dẫn là một thư mục. Xấu hổ cho tôi: /
Per G

4
Đã xảy ra với tôi ngày hôm qua facepalm . Tôi ghét các tin nhắn ngoại lệ
mơ hồ này

1
Tôi đã vật lộn trong hơn 6 giờ và sau khi xem phản hồi của bạn, thấy rằng đường dẫn là thư mục ... cảm ơn rất nhiều @CrazyTim ..
Người dùng M

6
Path is a directory.cảm ơn vì mẹo này :) Nó đã giúp tôi
Sidron

8
Ôi ... Đường dẫn là một thư mục. Cảm ơn Microsoft. Đó là RẤT truy cập trái phép.
Nghiêm túc

181

Tôi cũng có vấn đề, do đó tôi vấp phải bài đăng này. Tôi đã thêm dòng mã sau và trước khi Sao chép / Xóa.

Xóa bỏ

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

Sao chép

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);

17
Tôi đã cấp quyền 'Mọi người' cho thư mục mà không thành công. Bằng cách nào đó các thuộc tính tập tin làm việc mặc dù. Cảm ơn. Tôi ước MS cuối cùng sẽ giải quyết một mô hình bảo mật thích hợp. Cố gắng tìm hiểu tại sao Sao chép / Xóa phát nổ cứ sau vài năm lại gây khó chịu khi nói ít nhất.
Steve

13
SetAttribut Bình thường là mẹo đối với tôi - Tôi đã cố gắng File.Copy và ghi đè lên tệp chỉ đọc ..
Tom Hunter

6
Truy cập vào đường dẫn bị từ chối không cho thấy rằng tệp chỉ đơn giản là đọc (vì bạn thực sự có quyền truy cập vào đường dẫn!) Theo tôi, thông báo lỗi nên được thay đổi. Cảm ơn cho dù sao gợi ý!
MBoros

1
Tôi đã chạy chương trình với tư cách Quản trị viên và vấn đề đã biến mất.
Santiago Villafuerte

5
Làm thế nào để thiết lập một thuộc tính sau một hoạt động sao chép giúp? Không phải sự cố chương trình đã có trên bản sao kê sao? Có nên trước khi thao tác sao chép giống như thao tác xóa?
Vibhore Tanwer

31

Đây là một vấn đề cũ, nhưng tôi đã gặp phải nó trong khi tìm kiếm. Hóa ra tôi đã thiếu thành phần tên tệp thực tế trong đường dẫn lưu cho SaveAs ...

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

18

Khi người dùng cố gắng kết nối với trang Web của bạn, IIS sẽ gán kết nối cho tài khoản IUSER_ComputerName , trong đó ComputerName là tên của máy chủ mà IIS đang chạy. Theo mặc định, tài khoản IUSER_ComputerName là thành viên của nhóm Khách. Nhóm này có những hạn chế về bảo mật. Cố gắng truy cập lớn vào IUSER_ComputerName vào thư mục đó

Đây là câu trả lời được mô tả rất tốt về bảo mật IIS

Hi vọng điêu nay co ich


Cảm ơn điều này đã giúp .. Quyền cho người dùng IIS_IUSRS.
Tom

13

Nhấp chuột phải vào Visual studio và nhấp Run as Administrator


Đây là giải pháp cho sự cố File.Move của tôi trên máy Windows 8.1 Enterprise mà tôi là quản trị viên cục bộ và không có gì khác xử lý các tệp.
Robert Kerr

13

Tôi đã nhận được lỗi vì tôi đã không nhận ra rằng đích đến phải là một tệp. Tôi đã có một thư mục là tham số thứ hai (hoạt động trong cmd). và tôi đã nhận được Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.vì C # File.Movemuốn có một tệp ở đó, không chỉ cho tham số đầu tiên, mà cả cho tham số thứ hai, và vì vậy nếu bạn đặt một thư mục làm tham số thứ hai, nó sẽ cố gắng viết một tệp như c:\crpkhi bạn có một thư mục được gọi c:\crp.

điều này sẽ không chính xác File.Move(args[0],"c:\\crp");

Vì vậy, điều này sẽ đúng File.Move(args[0],"c:\\crp\\a.a");

Tương tự đối với File.Copy


1
Cảm ơn bạn! Điều này gián tiếp giải quyết một vấn đề trong đó API đang mong đợi một đích mà tôi đưa ra làm thư mục, không nhận ra nó phải bao gồm tên tệp (vì bản thân đối tượng có tên tệp liên quan).
Austin Salgat

7

Nếu đây là trang web IIS đang gặp sự cố, hãy kiểm tra thuộc tính Danh tính của cài đặt nâng cao cho nhóm ứng dụng mà trang web hoặc ứng dụng sử dụng. Bạn có thể thấy rằng nó được đặt thành ApplicationPoolIdentity và trong trường hợp đó, đây là người dùng sẽ phải có quyền truy cập vào đường dẫn.

Hoặc bạn có thể chuyển sang kiểu cũ và chỉ cần đặt Danh tính thành Dịch vụ Mạng và cấp cho người dùng Dịch vụ Mạng quyền truy cập vào đường dẫn.


3

Bạn cần sửa đổi các đặc quyền của thư mục bạn đang cố xóa từ / lưu vào. Nhấp chuột phải vào thư mục chứa và sử dụng tab Bảo mật để cho phép sửa đổi quyền cho người dùng mà ứng dụng của bạn chạy bên dưới.


bạn đang cho rằng anh ta là quản trị viên của máy mình .. nếu đây là máy làm việc và anh ta chỉ là người dùng .. họ có thể đặt quyền theo cách đó vì một lý do .. vì chúng tôi chỉ còn lại để giả định
Phương thức

1
Nó là một cỗ máy làm việc và tôi là một người sử dụng năng lượng. Tôi không đăng nhập với tư cách quản trị viên. Các thuộc tính của thư mục hình ảnh đã được sửa đổi để các dịch vụ mạng có quyền truy cập đầy đủ. Nhưng điều đó đã không làm cho bất kỳ sự khác biệt.
nick gowdy

1
Tôi vừa thêm "Mọi người" với toàn quyền truy cập vào thư mục và "voilá"
MarceloBarbosa

3

Ngoại lệ được ném khi hệ điều hành từ chối truy cập do lỗi I / O hoặc một loại lỗi bảo mật cụ thể.

Tôi đánh điều tương tự. Kiểm tra để đảm bảo rằng tập tin KHÔNG ĐƯỢC.


3

Tôi cũng đã phải đối mặt với vấn đề này khi dịch vụ cửa sổ của tôi bắt đầu ném ngoại lệ

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

Vì vậy, như một giải pháp, tôi đã kiểm tra tài khoản người dùng được liên kết với dịch vụ của mình, như thể hiện trong ảnh chụp màn hình bên dưới

nhập mô tả hình ảnh ở đây

Vì vậy, trong trường hợp của tôi, đó là DỊCH VỤ MẠNG

Và sau đó đi đến các thuộc tính thư mục để kiểm tra xem tài khoản người dùng được liên kết có tồn tại dưới tab quyền của họ hay không. Nó đã bị thiếu trong trường hợp của tôi và khi tôi thêm nó và nó đã khắc phục vấn đề của tôi.

Để biết thêm thông tin xin vui lòng kiểm tra chụp màn hình dưới đây

nhập mô tả hình ảnh ở đây


3

vấn đề tương tự đối với tôi cũng vậy, tôi đã chỉ thư mục thay vì tập tin.

Vì vậy, hãy chắc chắn trong đường dẫn, cung cấp đường dẫn + tên tệp

System.IO.File.WriteAllBytes("path", bytearray);

2

Kiểm tra thuộc tính tập tin của bạn. Nếu chỉ đọc được chọn, bỏ chọn nó. Đây là vấn đề cá nhân của tôi với UnlegAccessException.


2

Tôi đã nhận được lỗi này và giải quyết nó chỉ trong chốc lát. Không biết tại sao tất cả các thư mục của tôi chỉ đọc Tôi đã hủy chỉ đọc và áp dụng nó. Tuy nhiên, nó vẫn chỉ đọc. Vì vậy, tôi đã chuyển tập tin vào thư mục gốc, nó hoạt động - thật kỳ lạ.


2

Một ngoại lệ UnlegAccessException được đưa ra khi hệ điều hành từ chối truy cập vì lỗi I / O hoặc lỗi bảo mật.

Nếu bạn đang cố truy cập vào tệp hoặc khóa đăng ký, hãy đảm bảo rằng nó không chỉ đọc .


2

Nếu bạn đang sử dụng BitDefender, rất có thể tính năng Tệp an toàn của nó đã chặn hoạt động của bạn. Đây là một hình thức bảo vệ Ransomware đi kèm với một số phiên bản cao cấp hơn của nó.

Đảm bảo cấp quyền truy cập ứng dụng của bạn trong BitDefender và thử lại.

Một số chi tiết có thể được tìm thấy trong trang hỗ trợ BitDefender này .


1

Tôi gặp vấn đề tương tự trên một trang web mới được chuyển trên một máy chủ được chia sẻ. Được giải quyết thông qua bảng điều khiển máy chủ web (DotNetPanel), thiết lập đúng "cho phép ghi quyền". Vì vậy, nếu bạn đang ở trong một máy chủ được chia sẻ trước khi xem xét tất cả các mã đáng xem qua cấu hình máy chủ và có thể giúp bạn tiết kiệm rất nhiều thời gian.


1

Xin lưu ý rằng nếu bạn đang cố gắng truy cập đường dẫn thư mục dùng chung từ mã của mình, bạn không chỉ cần cấp quyền phù hợp cho thư mục vật lý thông qua tab bảo mật. Bạn cũng cần "chia sẻ" thư mục với người dùng nhóm ứng dụng tương ứng thông qua Tab chia sẻ


1

Tôi đã phải đối mặt với lỗi này bởi vì

Đôi khi tôi Combinenhững con đường với File NameFileName = ""

Path Directorykhông phải filelà một vấn đề như đã đề cập ở trên

vì vậy bạn phải kiểm tra FileNamenhư thế này

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));

1

Tôi đã có lỗi chính xác khi xóa một tập tin. Đó là một Dịch vụ Windows chạy trong Tài khoản dịch vụ không thể xóa tài liệu .pdf khỏi Thư mục dùng chung mặc dù nó có toàn quyền kiểm soát thư mục.

Điều làm việc cho tôi là điều hướng đến tab Bảo mật của Thư mục được chia sẻ> Nâng cao> Chia sẻ> Thêm.

Sau đó tôi đã thêm tài khoản dịch vụ vào nhóm quản trị viên, áp dụng các thay đổi và tài khoản dịch vụ sau đó có thể thực hiện tất cả các thao tác trên tất cả các tệp trong thư mục đó.


1

Đối với những người đang cố gắng tạo một ứng dụng UWP (Universal Windows), quyền truy cập tệp bị hạn chế hơn nhiều và nói chung là bị từ chối theo mặc định. Nó cũng thay thế các quyền của người dùng hệ thống. Về cơ bản, bạn sẽ chỉ có quyền truy cập vào các tệp trong một trong hai

  • Vị trí cài đặt của bạn
  • Vị trí AppData của bạn
  • File được chọn qua các tập tin hoặc thư mục chọn
  • Vị trí được yêu cầu trong Bản kê khai ứng dụng của bạn

Bạn có thể đọc thêm ở đây để biết chi tiết => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions


1

Trong trường hợp của tôi, vấn đề là Norton. Chương trình nội bộ của tôi không có chữ ký điện tử phù hợp và khi nó cố xóa một tệp, nó đã đưa ra UnlegAccessException.

nhập mô tả hình ảnh ở đây

Nếu nó cung cấp cho bạn một thông báo, bạn có thể xử lý nó từ đó. Trong trường hợp của tôi, nó đã không đưa ra một thông báo mà tôi nhận thấy. Vì vậy, đây là cách để giữ Norton chặn chương trình.

  1. Mở Norton
  2. Nhấp vào mũi tên xuống
  3. Nhấp vào Lịch sử
  4. Tìm hoạt động theo chương trình
  5. Nhấp vào Tùy chọn khác
  6. Nhấp vào Loại trừ quá trình

0

Tôi cũng gặp phải vấn đề tương tự khi cố gắng làm điều này sau khi triển khai tại máy chủ:

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);

Tôi đã cấp quyền trong IIS cho nhóm khác bao gồm cả quản trị viên và vấn đề của tôi đã được giải quyết.


0

Tôi đã thấy rằng lỗi này có thể xảy ra trong THIẾT KẾ THIẾT KẾ trái ngược với? chế độ thực thi ... Nếu bạn đang làm một việc gì đó như tạo một thành viên lớp yêu cầu quyền truy cập vào tệp .INI hoặc .HTM (tệp cấu hình, tệp trợ giúp), bạn có thể muốn KHÔNG khởi tạo mục trong khai báo, nhưng khởi chạy lại sau trong FORM_Load () vv ... Khi bạn khởi tạo ... Sử dụng câu lệnh IF bảo vệ:

    /// <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();
        }
    }

Điều này sẽ ngăn MSVS Designer không cố tạo tệp INI hoặc HTM khi bạn ở chế độ thiết kế.


0

Tôi đã gặp lỗi này khi cố gắng đổi tên một thư mục rất nhanh sau khi nó được di chuyển hoặc tạo.

Một cách đơn giản đã System.Threading.Thread.Sleep(500);giải quyết nó:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}

Hãy nghĩ rằng sẽ tốt hơn nếu bạn kiểm tra xem thư mục có tồn tại trước khi di chuyển không thay vì ngủ nửa giây ... nếu hệ điều hành bận thì việc di chuyển trước đó có thể mất hơn nửa giây và bạn quay lại vấn đề tương tự.
Paul Zahra

Đoạn mã này rất nguy hiểm. Nó lặp lại phương thức RenameFile bất kể ngoại lệ nào được ném! Nó có thể khiến ứng dụng bị sập nếu nguyên nhân ngoại lệ là vấn đề cấp phép thực tế
Hossein Shahdoost

0

Trong trường hợp cụ thể của tôi, tôi đã nhiều lần tạo và xóa 10000 thư mục. Dường như với tôi rằng vấn đề nằm ở chỗ mặc dù phương thức Directory.Delete(path, true)trả về, cơ chế HĐH dưới quyền vẫn có thể xóa các tệp khỏi đĩa. Và khi tôi bắt đầu tạo các thư mục mới ngay lập tức sau khi xóa những thư mục cũ, một số trong số chúng vẫn bị khóa vì chúng chưa bị xóa hoàn toàn. Và tôi đang nhận được System.UnauthorizedAccessException: "Truy cập vào đường dẫn bị từ chối".

nhập mô tả hình ảnh ở đây

Sử dụng Thread.Sleep(5000)sau khi Directory.Delete(path, true)giải quyết vấn đề đó. Tôi hoàn toàn đồng ý rằng điều này không an toàn và tôi không khuyến khích bất cứ ai sử dụng nó. Tôi rất thích ở đây một cách tiếp cận tốt hơn để giải quyết vấn đề này để cải thiện câu trả lời của tôi. Bây giờ tôi chỉ đưa ra một ý tưởng tại sao ngoại lệ này có thể xảy ra.

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());
        }
    }
}

0

Đầu tiên chỉ cần kiểm tra đường dẫn nếu ký tự dấu hai chấm (:) có bị thiếu hay không sau ký tự ổ đĩa. Nếu dấu hai chấm không bị thiếu thì bạn có thể kiểm tra xem quyền truy cập / ghi có được cấp cho đường dẫn đó không. Tôi đã có cùng một vấn đề và tôi chỉ thiếu dấu hai chấm, sự cho phép và mọi thứ khác đều ổn.

C:\folderpath

sẽ hoạt động tốt, nhưng,

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

sẽ cung cấp cho bạn truy cập lỗi từ chối.


0

Tôi đã cố gắng sử dụng System.IO.File.OpenWrite (đường dẫn)

và nó không hoạt động bởi vì tôi chỉ truyền OpenWrite () một đường dẫn đến một thư mục, nhưng nó yêu cầu một đường dẫn đến tất cả các tệp bạn muốn viết. Vì vậy, một đường dẫn đầy đủ bao gồm tên tệp.extension ở cuối cần phải được chuyển vào OpenWrite để tránh UnlegAccessException


0

Tôi cũng chạy vào bài viết này như là xử lý vấn đề tương tự. Có vẻ như tập tin đang được sử dụng và do đó không thể ghi vào nó. Mặc dù không thể tìm ra nó, quá trình nào đang sử dụng nó. Đăng xuất người dùng khác đã đăng nhập vào hộp đó, không thấy bất kỳ người dùng nào đang giữ nó. Bất kỳ lời khuyên nhanh chóng liên quan đến làm thế nào để tìm thấy cùng.

Cảm ơn, Lakshay (nhà phát triển)


Trong câu trả lời của bạn không đăng một câu hỏi mới, nhưng hãy cố gắng trả lời câu hỏi của người đăng ban đầu với thông tin hữu ích. Đối với câu hỏi của riêng bạn, vui lòng tìm kiếm stackoverflow trước cho các câu hỏi tương tự hoặc tương tự. Nếu bạn không tìm thấy câu nào, hãy đăng câu hỏi mới theo hướng dẫn sau: Cách đặt câu hỏi hay
alev

0

Để giải quyết vấn đề này, tôi làm theo cách tiếp cận Scot Hanselman tại Debugging System.UnauthorizedAccessException (thường được theo sau: Truy cập vào đường dẫn bị từ chối) , mã với ví dụ dưới đây:

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;
            }
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.