Đây là những gì bạn có thể làm:
1) Bạn có thể kiểm tra xem bạn có quyền truy cập vào các tập tin trước cố gắng truy cập vào tập tin của bạn. Từ this SO thread, đây là phương thức sẽ trả về true nếu người dùng có quyền Write
(nghĩa là khi nhấp chuột phải vào tệp -> thuộc tính -> bảo mật). Này bao gồm các quan điểm của bạn (2) cho đặc quyền truy cập không dùng đến (đừng lưu ý rằng có lẽ là một cái gì đó trở nên mạnh mẽ/lỗi chống để có được thông tin này hơn so với mã bên dưới):
public static bool HasWritePermissionOnFile(string path)
{
bool writeAllow = false;
bool writeDeny = false;
FileSecurity accessControlList = File.GetAccessControl(path);
if (accessControlList == null)
{
return false;
}
var accessRules = accessControlList.GetAccessRules(true, true, typeof(SecurityIdentifier));
if (accessRules == null)
{
return false;
}
foreach (FileSystemAccessRule rule in accessRules)
{
if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write)
{
continue;
}
if (rule.AccessControlType == AccessControlType.Allow)
{
writeAllow = true;
}
else if (rule.AccessControlType == AccessControlType.Deny)
{
writeDeny = true;
}
}
return writeAllow && !writeDeny;
}
2) Đừng cố gắng để nhanh chóng FileStream
của bạn , và ngoại lệ bắt:
try
{
string file = "...";
bool hasWritePermission = HasWritePermissionOnFile(file);
using (FileStream fs = new FileStream(file, FileMode.Open))
{
}
}
catch (UnauthorizedAccessException ex)
{
// Insert some logic here
}
catch (FileNotFoundException ex)
{
// Insert some logic here
}
catch (IOException ex)
{
// Insert some logic here
}
Trong trường hợp của bạn (3) (tập tin đòi hỏi độ cao), UnauthorizedAccessException
được ném.
Trong trường hợp của bạn (1) (tệp bị khóa bởi một quy trình khác), IOException
bị ném. Sau đó, bạn có thể kiểm tra HRESULT của ngoại lệ để biết thêm chi tiết:
catch (IOException ex)
{
// Gets the HRESULT
int hresult = Marshal.GetHRForException(ex);
// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx
// for system error code
switch (hresult & 0x0000FFFF)
{
case 32: //ERROR_SHARING_VIOLATION
Console.WriteLine("File is in use by another process");
break;
}
}
Bây giờ bạn sẽ có thể phân biệt 3 trường hợp sử dụng của mình.
Có sự khác biệt nào giữa 2 trường hợp cuối cùng bạn muốn kiểm tra không? Tôi sẽ tưởng tượng (mặc dù chưa được chứng minh) rằng cả hai sẽ ném một 'SecurityException', trong trường hợp đầu tiên sẽ ném một' IOException'. –
@ M.Babcock: Theo một số cách, hai trường hợp cuối cùng không khác nhau. Tuy nhiên, người dùng phải (nói chung) làm những việc rất khác nhau để có quyền truy cập vào tệp. Đối với trường hợp thứ 2, họ có thể cần yêu cầu người dùng khác cấp quyền cho họ. Đối với trường hợp thứ 3, họ cần "Chạy với tư cách Quản trị viên" hoặc có thể di chuyển tệp ra khỏi thư mục "Program Files" (mặc dù tại sao nó lại ở trong đó mà tôi không biết). Tôi muốn giúp người dùng biết những gì họ cần làm để có quyền truy cập vào tệp. – skybluecodeflier
Một lần nữa, tôi có thể cho thấy sự thiếu hiểu biết của tôi về hệ điều hành Windows trong bình luận trước đây của tôi- tôi mở để sửa nếu giải thích của tôi là không chính xác. – skybluecodeflier