• 0

[VB.NET] Delete File in process


Question

Ok gang,

I've got an interesting problem. I have a .net 2.0 app that goes off to a server to get a file and unzip it locally. This process is threaded. It's possible that during the first run through the process the end-user may need to stop the original process and go get a different file.

So, I abort the initial thread and start over. The issue? (Glad you asked) Seems that one or more files (the zip and possibly files from within the zip file, depending on how far along the initial process is) will not delete (File.Delete(path) as these files are in use my another process.

Exact error:

Description: The process cannot access the file 'c:\TestExtract\75872-01-1.ado' because it is being used by another process.

The code that is pulling the file from the zip is here:

--- BEGIN CODE CHUNK --------

If (sFileName <> String.Empty) Then

Dim StreamWriter As FileStream = File.Create(sDirectory & theEntry.Name)

Dim Size As Integer = 2048

Dim data(2048) As Byte

While (True)

Size = stmZipFile.Read(data, 0, data.Length)

If (Size > 0) Then

StreamWriter.Write(data, 0, Size)

Else

Exit While

End If

End While

StreamWriter.Close()

End If

--- END OF CODE CHUNK --------

Ive tried watching for the thread's abort request in that loop, but it never gets it. So I can't close the stream (arg)

I've looked to see if I can get the handle of the process that is using the file so I can kill the process and then the file... but so far no luck. I'm heading home now, but I'll check back in a few hours (it's 5pm est)

Thanks for any ideas.

Link to comment
https://www.neowin.net/forum/topic/578013-vbnet-delete-file-in-process/
Share on other sites

4 answers to this question

Recommended Posts

  • 0

The quickest thing that I would offer would be to have some type of boolean variable that the code chunk continuously checks within it's while(true) loop. such as

While(_cancelZip = false)
   Size = stmZipFile.Read(data, 0, data.Length)
   If (Size &gt; 0) Then
	  StreamWriter.Write(data, 0, Size)
   Else
	  Exit While
   End If
End While

_cancelZip should be a private member variable that can be accessed externally through an Exposed Property.

After this loop, check to see if _cancelZip = true. If it is, you must close this StreamWriter and then delete the file.

Does this make sense?

  • 0

There is a FileSystemWatcher component that you may be able to use. Have you looked into that?

EDIT: Re-read your question and the FileSystemWatcher probably isn't what you're looking for.

Anyway, you are right in looking for the Abort Thread request, but the fact that you aren't getting that means that you are most likely not threading properly. Although bleepjay's solution will probably work, it is clumsy and not the way it should be done with the advent of Threading in .NET. I recommend you look at some of the many threading tutorials online.

Here are a few links I Googled quickly, hope it's useful:

http://msdn.microsoft.com/msdnmag/issues/01/07/vbnet/

http://www.devx.com/getHelpOn/10MinuteSolution/20365

http://www.stardeveloper.com/articles/disp...0404&page=1

http://blogs.msdn.com/dougturn/archive/200...and-vb-net.aspx

Edited by magik
  • 0
  bleepjay said:
The quickest thing that I would offer would be to have some type of boolean variable that the code chunk continuously checks within it's while(true) loop. such as

While(_cancelZip = false)
   Size = stmZipFile.Read(data, 0, data.Length)
   If (Size &gt; 0) Then
	  StreamWriter.Write(data, 0, Size)
   Else
	  Exit While
   End If
End While

_cancelZip should be a private member variable that can be accessed externally through an Exposed Property.

After this loop, check to see if _cancelZip = true. If it is, you must close this StreamWriter and then delete the file.

Does this make sense?

Hummm... the boolean is an intesting idea. I can set that, wait a moment and then kill the process. I'll give it a try in the morning.

magik,

As for the file system watcher... how would that help? I need to get a specific file at a specific time, not all the files (there are thousands of them!). But maybe you meant something else that I'm not getting.

  • 0

^ Yea, sorry, I didn't read your question fully the first time. I hope my edited post is of more use to you. :)

To clarify: Instead of looking for the Abort Request within your loop, you should have the loop within a Thread Process and then a separate Event Hander that Handles the Thread Abort Request. When that event is fired, it should halt the Thread Process.

Does that make more sense?

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I suspect that this was also due to a nice juicy bribe from the Chinese. They know how to pay to play...
    • You can get RAID if it is connected to a TerraMaster NAS (TOS 6). In that case this device is interesting if you want to expand your existing TerraMaster NAS setup. For example you could get a cheap 2- or 4-bay HDD model (with at least USB 3.2 10Gbps port), and then add this for a low power storage expansion.
    • Microsoft announces multi-year partnership with AMD for future of Xbox consoles and hardware by Pulasthi Ariyasinghe The Xbox Games Showcase was earlier this month with its own hardware announcement, but Microsoft had kept a major partnership under wraps for now. Today, it revealed that it has established a "strategic multi-year partnership with AMD" to develop its next-generation Xbox consoles and other devices. In a video uploaded to the Xbox social channels, Xbox president Sarah Bond announced the partnership with AMD. Remember that Microsoft's Xbox Series X|S consoles and the previous Xbox One lineup already tout AMD silicon inside, so the continued partnership isn't a big surprise. "Together with AMD we're advancing the state of art in gaming silicon to deliver the next generation of graphics innovation to unlock a deeper level of visual quality and immersive gameplay and player experiences enhanced with the power of AI, all while maintaining compatibility with your existing library of Xbox games," said Bond in the video promoting the partnership. The two Xbox Ally Windows gaming handhelds that were announced earlier this month also come with AMD internals, offering handheld gaming experiences with a unique, lightweight version of bloat-free Windows 11. What was also interesting were the few hints that were dropped today regarding the focus of the Xbox brand going forward. "This is all about building you a gaming platform that's always with you, so you can play the games you want across devices anywhere you want, delivering you an Xbox experience not locked to a single store or tied to one device," added Bond. It was also confirmed that the next generation of Xbox devices will continue to offer backward compatibility, letting players keep their existing libraries when moving forward. Finishing off the video, Bond confirmed that the Xbox team is now working on Windows to make it the "number one platform for gaming," perhaps alluding to moving away from being focused on home consoles.
    • Kudos to the happy talented people who created that happy trailer. PS It's gorgeous!
    • Maybe the site will get out of dabbing into Identity Politics.
  • Recent Achievements

    • Reacting Well
      Cole Multipass earned a badge
      Reacting Well
    • Reacting Well
      JLP earned a badge
      Reacting Well
    • Week One Done
      Rhydderch earned a badge
      Week One Done
    • Experienced
      dismuter went up a rank
      Experienced
    • One Month Later
      mevinyavin earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      696
    2. 2
      ATLien_0
      275
    3. 3
      Michael Scrip
      218
    4. 4
      +FloatingFatMan
      188
    5. 5
      Steven P.
      146
  • Tell a friend

    Love Neowin? Tell a friend!