2010-01-05 28 views
10

Tôi có một ứng dụng đang xem xét một số tệp cho dữ liệu cũ. Để đảm bảo chúng tôi không làm hỏng các dự án tốt, tôi sẽ sao chép các tệp vào một vị trí tạm thời. Một số thư mục tôi đang kiểm tra là các thư mục mã nguồn và chúng có thư mục .svn. Chúng tôi sử dụng Subversion để quản lý mã của chúng tôi.UnauthorizedAccessException trên các tệp mới được tạo

Khi tôi đã tìm kiếm qua tất cả các tệp, tôi muốn xóa bộ đệm tạm thời. Nghe có vẻ dễ dàng, phải không?

Vì một số lý do, tất cả thư mục .svn của tôi sẽ không xóa khỏi bộ nhớ cache. Chúng làm hỏng ứng dụng.

Vì lý do (quá sâu để đi vào đây), tôi phải sử dụng thư mục tạm thời, do đó, chỉ cần "quét tệp gốc" là do câu hỏi vì lý do chính trị.

Tôi có thể truy cập trình khám phá và xóa chúng. Không vấn đề gì. Không có cảnh báo. Chỉ cần xóa. Nhưng mã bị treo với "Access to {file} bị từ chối." Tôi đang ở trí thông minh của tôi kết thúc với điều này, vì vậy bất kỳ trợ giúp sẽ được đánh giá cao.

Trong khi tôi đã đơn giản hóa chức năng một LITTLE vì lợi ích của sự tỉnh táo của bạn, mã REALLY là về việc này đơn giản.

List<string> tmpCacheManifest = new List<string>(); 
string oldRootPath = "C:\\some\\known\\directory\\"; 
string tempPath = "C:\\temp\\cache\\"; 

foreach (string file in ListOfFilesToScan) 
{ 
    string newFile = file.Replace(oldRootPath, tempPath); 

    // This works just fine. 
    File.Copy(file, newFile); 

    tmpCacheManifest.add(newFile); 
} 

// ... do some stuff to the cache to verify what I need. 


// Okay.. I'm done.. Delete the cache. 
foreach (string file in tmpCacheManifest) 
{ 
    // CRASH! 
    File.Delete(file); 
} 

* Cập nhật *: Trường hợp ngoại lệ là UnauthorizedAccessException. Văn bản là "Truy cập vào đường dẫn" C: \ temp \ cache \ some-sub-dirs \ .svn \ entries 'bị từ chối. "

Nó xảy ra dưới XP, XP-Pro và Windows 7.

* Cập nhật 2 * Không ai trong số xác nhận của tôi thậm chí cố gắng nhìn vào file lật đổ. Tuy nhiên, tôi cần chúng. Đó là một phần của crap chính trị. Tôi phải cho thấy rằng mọi tập tin đã được sao chép ... wheter nó đã được quét hay không.

Và tôi nhận ra các nghi phạm thông thường là gì đối với File.Delete. Tôi nhận ra những gì UnauthorizedAccessException có nghĩa là. Tôi không có quyền truy cập. Đó là không có trí tuệ. Nhưng tôi vừa sao chép tập tin. Làm thế nào tôi có thể NOT có quyền truy cập vào tệp?

* Cập nhật 3 * Câu trả lời nằm trong cờ "chỉ đọc". Dưới đây là đoạn code tôi sử dụng để sửa chữa nó:

foreach (string file in ListOfFilesToScan) 
{ 
    string newFile = file.Replace(oldRootPath, tempPath); 

    // This works just fine. 
    File.Copy(file, newFile); 

    //// NEW CODE //// 
    // Clear any "Read-Only" flags 
    FileInfo fi3 = new FileInfo(fn); 
    if ((fi3.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
    { 
     fi3.Attributes = (FileAttributes)(Convert.ToInt32(fi3.Attributes) - Convert.ToInt32(FileAttributes.ReadOnly)); 
    } 



    tmpCacheManifest.add(newFile); 
} 

// ... do some stuff to the cache to verify what I need. 

+3

Ngoại lệ là gì? Có thể có một khóa tập tin. –

+0

File.Delete có thể ném ít nhất bảy loại ngoại lệ khác nhau. Bạn đang nhận được cái nào? –

+0

@Roboto, Ý của bạn là: WTE? TCBAFL? –

Trả lời

12

Theo như tôi nhớ lại, Subversion đánh dấu các tệp trong thư mục con .svn là chỉ đọc.

Thử đặt lại thuộc tính chỉ đọc trước khi xóa tệp. Tôi thực sự không biết bất kỳ C#, nhưng một cách nhanh chóng của Google cho thấy điều này có thể làm các trick:

File.SetAttributes(file, FileAttributes.Normal); 
+1

Tôi đã thử nghiệm điều này, và tất cả các đề xuất cho đến nay đây là người duy nhất thực sự gây ra một ngoại lệ! – Justin

+0

Cuộc gọi tốt! Tôi đã không xem xét "Chỉ đọc". Tuy nhiên, nó vẫn ném ngoại lệ. Tôi thực sự muốn bash cái gì đó, ở đây. =) – Jerry

+0

GOT IT !! Cuối cùng ... vụ tai nạn thứ hai là do một sự kỳ quặc khác, không phải vấn đề này. – Jerry

-2

Không hiểu biết những gì bạn muốn làm rất nhiều, nhưng những gì về chmoding nó để 777 hoặc 775.: -/

Edit:

Nhận thấy trên cửa sổ của bạn. Bạn sẽ phải thay đổi quyền. Không biết cửa sổ hoạt động như thế nào: -/

0

Trước hết: "Sự cố" có nghĩa là ngoại lệ, phải không? Cái nào? Bạn có thể nắm bắt nó và hiển thị nó?

Điều thứ hai: Bạn đang sao chép kho lưu trữ lật đổ, mặc dù bạn không quan tâm đến siêu dữ liệu lật đổ? Đó là những gì xuất khẩu svn là về (không có thư mục .svn trong mục tiêu).

Câu trả lời cho câu hỏi đầu tiên là những gì bạn thực sự cần cung cấp. Có lẽ một cái gì đó lấy .svn và khóa một số tập tin. TortoiseSVN có thể (để cung cấp cho bạn các biểu tượng lớp phủ đẹp ..)?

2

Vấn đề duy nhất tôi nhìn thấy sẽ là trong phần này:

// ... do some stuff to the cache to verify what I need.

Nếu bạn làm mở file và quên đóng nó lại, bạn vẫn có thể truy cập độc quyền cho nó, và do đó không thể xóa sau này.

+0

Đồng ý. Nếu bạn đang xử lý các đối tượng 'FileStream', hãy chắc chắn gọi' Close' trên chúng (gọi là 'Dispose'). Thậm chí tốt hơn là chỉ cần bọc chúng trong các khối 'sử dụng'. –

+2

Điều này sẽ không phải là nguyên nhân - nếu bạn làm điều đó thì bạn ngăn các quá trình khác xóa tập tin, tuy nhiên nếu quá trình tương tự tìm cách xóa tệp thì không có vấn đề gì vì xử lý/khóa được sở hữu bởi cùng một quá trình. Tôi đã thử nghiệm điều này và nó không gây ra một ngoại lệ. – Justin

2

Âm thanh như bạn không có quyền truy cập để xóa các tập tin ...

system.io.file.delete

Liên kết ở trên nói rằng bạn có được UnauthorizedAccessException khi:

Người gọi không có yêu cầu sự cho phép.

-hoặc-

đường dẫn là một thư mục.

-hoặc-

đường dẫn chỉ định tệp chỉ đọc.

Đó là một trong số đó.

+0

Anh ấy phải có quyền truy cập để xóa tệp khi có quyền truy cập để tạo tệp ngay từ đầu. – Justin

+0

Vâng, anh ấy tự nói rằng đó là ngoại lệ đang bị ném, tôi không biết làm thế nào. –

1

Âm thanh như vấn đề về quyền. Mặc dù bạn có thể viết một cách dễ dàng nếu File.Copy đã hoạt động ....

Điều duy nhất tôi có thể nghĩ là tệp vẫn có một tay cầm được mở ở đâu đó (như những người khác đã gợi ý có lẽ trong số của bạn làm một số công cụ vào bộ nhớ cache phần).

+0

Anh ấy phải có quyền truy cập để xóa tệp khi có quyền truy cập để tạo tệp ở địa điểm đầu tiên. – Justin

+0

@Kragen Tôi thực sự đã nói rằng trong phản hồi của tôi ... – James

0

Nếu một thư mục chứa các file read only, Directory.Delete sẽ không xóa nó và nâng cao ngoại lệ bạn nhận được. Đối với du khách trong tương lai của trang này, tôi đã tìm ra một giải pháp đơn giản mà không đòi hỏi chúng ta phải recurse qua tất cả các tập tin và thay đổi thuộc tính read-only của họ:

Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles"); 

(Thay đổi một chút để không bắn một cửa sổ cmd trong giây lát, có sẵn trên internet)

Các vấn đề liên quan