<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx</link><description>Yes, it's time for another "What's wrong with this code"... Today's example of bad coding involves an attempt to speed up file copy operations by overlapping the read and write operations to the file. The theory is that the system can be reading from</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369918</link><pubDate>Wed, 09 Feb 2005 18:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369918</guid><dc:creator>B.Y.</dc:creator><description>Well I can see:&lt;br&gt;1. No error checking on QueueUserWorkItem() call.&lt;br&gt;2. Unsynchronized file access from multiple threads (set pointer, read, write).&lt;br&gt;3. Unsynchronized access to *dataLengthWritten / fileSizeCopied.&lt;br&gt;4. If the while loop returns, fileSizeCopied goes out of scope. If this happens just before one or more threads execute:&lt;br&gt;&lt;br&gt;    dataBlock-&amp;gt;dataLengthWritten -&amp;gt;&lt;br&gt;           QuadPart += dataBlock&lt;br&gt;                         -&amp;gt;readLength;&lt;br&gt;&lt;br&gt;stack is trashed.&lt;br&gt;5. Creating a thread to read and write 64K is really bad. It's better to have one read thread and one write thread.&lt;br&gt;</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369919</link><pubDate>Wed, 09 Feb 2005 18:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369919</guid><dc:creator>Skywing</dc:creator><description>The first thing that comes to mind is no synchronization with the number of bytes written.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369924</link><pubDate>Wed, 09 Feb 2005 18:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369924</guid><dc:creator>Larry Osterman</dc:creator><description>B.Y.  #1 is one I missed :(&lt;br&gt;#2 is the complicated issue.&lt;br&gt;#3 is the simple coding issue&lt;br&gt;#4 can't happen - the loop doesn't execute until after all the threads have completed their reads and updated their value.&lt;br&gt;&lt;br&gt;And #5 touches on one of of the design issues...  But not clearly - there's an explicit reason why its bad.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369937</link><pubDate>Wed, 09 Feb 2005 18:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369937</guid><dc:creator>Stuart Ballard</dc:creator><description>Is it going to create horribly fragmented files if a block late in the file is written before the earlier blocks?&lt;br&gt;&lt;br&gt;(I'm not personally familiar with the APIs you're using and most of my own coding is in C#, so I'm guessing as to the behavior of, particularly, the SetFilePointerEx() function)</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369940</link><pubDate>Wed, 09 Feb 2005 18:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369940</guid><dc:creator>Larry Osterman</dc:creator><description>Stuart, yes, possibly - not likely, but possibly.  The original concept for the code had a call to SetFIlePositionEx on the destination to match the size of the source file but I pulled it to conserve space.  &lt;br&gt;&lt;br&gt;That would have avoided the issue completely (because the SetFilePositionEx would have extended the file and ensured that the file had storage reserved on the destination).&lt;br&gt;&lt;br&gt;</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369944</link><pubDate>Wed, 09 Feb 2005 18:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369944</guid><dc:creator>B.Y.</dc:creator><description>#4: the first while loop returns if &amp;quot;new FileCopyBlock&amp;quot; returns NULL.&lt;br&gt;</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369945</link><pubDate>Wed, 09 Feb 2005 18:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369945</guid><dc:creator>Larry Osterman</dc:creator><description>B.Y. - Ah, I missed that - you're right, it should be exit(1) in that failure case (which makes the corruption moot).&lt;br&gt;</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369957</link><pubDate>Wed, 09 Feb 2005 19:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369957</guid><dc:creator>Harald</dc:creator><description>Alternate data streams don't get copied (:Zone.Identifier:$DATA gets lost)&lt;br&gt;&lt;br&gt;The slow part, when copying files are the disks. The code converts a sequentiell access pattern to a possibly random pattern.&lt;br&gt;&lt;br&gt;The whole code does not have any benefit over using the api CopyFile/CopyFileEx that does not have the problems metioned above.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369967</link><pubDate>Wed, 09 Feb 2005 19:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369967</guid><dc:creator>Paul Winwood</dc:creator><description>I think FILE_READ_DATA should be GENERIC_READ because GetFileSizeEx requires GENERIC_READ. &lt;br&gt;I would not use FILE_READ_DATA with CreateFile as its only documented for ZwCreateFile().</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369976</link><pubDate>Wed, 09 Feb 2005 19:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369976</guid><dc:creator>Larry Osterman</dc:creator><description>Harald, I did mention that alternate data streams got lost and that it wasn't one of the bugs.&lt;br&gt;&lt;br&gt;On the other hand, your second point is 100% spot on, it hits on two of the major issues with this code.&lt;br&gt;&lt;br&gt;Paul: Are you sure?  If GetFileSize requires FILE_READ_ATTRIBUTES, then the GetFileSizeEx call should be replaced with SetFilePointerEx(handle, 0, SEEK_END), since it returns the same information.&lt;br&gt;</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369985</link><pubDate>Wed, 09 Feb 2005 19:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369985</guid><dc:creator>Paul Winwood</dc:creator><description>Ah! You are right GENERIC_READ is the miniumum for 9x/Me only.&lt;br&gt;Of course the advantage of GetFileSize(Ex) is that it does not move the current position.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369990</link><pubDate>Wed, 09 Feb 2005 20:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369990</guid><dc:creator>B.Y.</dc:creator><description>I guess you really just need two buffers and use overlapped read and write from your main thread, but I think this is an advantage only if the two files are on separate phyiscal drives.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369994</link><pubDate>Wed, 09 Feb 2005 20:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369994</guid><dc:creator>Larry Osterman</dc:creator><description>B.Y. Bingo - that's one of the huge issues with the code: overlapping I/O only really helps if you've got more than one spindle.&lt;br&gt;&lt;br&gt;Otherwise you spend all your time moving the heads back and forth.&lt;br&gt;&lt;br&gt;There are still a couple of design issues outstanding that haven't been touched upon but most of the big ones have been caught.&lt;br&gt;&lt;br&gt;There's still at least one really big one though.&lt;br&gt;</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#369999</link><pubDate>Wed, 09 Feb 2005 20:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369999</guid><dc:creator>Capt. Jean-Luc Pikachu</dc:creator><description>I thought new couldn't return NULL, it could only throw an exception?  Or is that how FileCopyBlock's constructor works?</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370004</link><pubDate>Wed, 09 Feb 2005 20:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370004</guid><dc:creator>Johnny Lee</dc:creator><description>How about:&lt;br&gt;1) CreateFile on Win9X fails on the dest because there's a template file supplied - so says MSDN.&lt;br&gt;2) is the code guaranteed srcFile != destFile?&lt;br&gt;3) You could probably tweak the CreateFile flags using FILE_FLAG_NO_BUFFERING and FILE_FLAG_SEQUENTIAL_SCAN, but your algorithm would have to be modified to ensure sequential scan and using appropriately aligned buffers.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370006</link><pubDate>Wed, 09 Feb 2005 20:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370006</guid><dc:creator>Larry Osterman</dc:creator><description>Jean-Luc: new can return NULL unless you use the throwing version of new.  And if you've been reading for a while, you know how I feel about exceptions :) Hint: I don't like them and avoid them whenever possible.&lt;br&gt;&lt;br&gt;Johnny: Win9x?  What's that?&lt;br&gt;2: Good catch, not a bug: The code will fail in that case because the call to CreateFile on the destination will fail.&lt;br&gt;3) I'll talk about FILE_FLAG_NO_BUFFERING a bit in my &amp;quot;answers&amp;quot; post - that's a really good point.&lt;br&gt;</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370017</link><pubDate>Wed, 09 Feb 2005 21:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370017</guid><dc:creator>Mike Dimmick</dc:creator><description>Since you're using new and presumably haven't overloaded operator new, your threads will be contending for the process heap's critical section. That's a fairly minor issue.&lt;br&gt;&lt;br&gt;The thread pool scheduler might make a bad decision about how many threads to start. Since you've got blocking I/Os in the thread I'd suggest using WT_EXECUTELONGFUNCTION. By default the pool will create up to 500 threads which will typically use 500MB of virtual address space. For a large file this limit might be hit due to the blocking I/Os - in fact, you only need a 32MB file before you've queued 500 work items.&lt;br&gt;&lt;br&gt;The CreateFile call for the file to be read doesn't specify any sharing flags. I'd suggest setting FILE_SHARE_READ so that at least another process can read the file while you're copying it!&lt;br&gt;&lt;br&gt;The documentation for WT_EXECUTEINIOTHREAD mentions APCs and the need to handle re-entrancy. I'm not sure what it's talking about here - presumably this would only apply if you were using alertable waits.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370027</link><pubDate>Wed, 09 Feb 2005 21:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370027</guid><dc:creator>Larry Osterman</dc:creator><description>Ahh, but you're missing one critical aspect of the thread pool Mike: How many threads DOES it spin up?&lt;br&gt;&lt;br&gt;WT_EXECUTELONGFUNCTION forces a new thread to be created for each request, which burns a lot of time - it's not executed by the thread pool anymore.&lt;br&gt;</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370044</link><pubDate>Wed, 09 Feb 2005 21:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370044</guid><dc:creator>Mike Dimmick</dc:creator><description>&amp;quot;Work items are queued to I/O worker threads as asynchronous procedure calls (APC).&amp;quot; - &lt;a target="_new" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/thread_pooling.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/thread_pooling.asp&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Nope, no clearer. However, this article might help: &lt;a target="_new" href="http://www.microsoft.com/msj/0499/pooling/pooling.aspx"&gt;http://www.microsoft.com/msj/0499/pooling/pooling.aspx&lt;/a&gt;. So it looks like new threads will be created after a period of time or a number of requests are queued (see Figure 1 in the linked article). We queue a very large number of requests, which will block twice. OK, we won't create 500 threads for a 32MB file. The speed at which we obtain the data will presumably govern how many threads are created. The slower we get, the more threads will probably be created.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370053</link><pubDate>Wed, 09 Feb 2005 22:04:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370053</guid><dc:creator>Foolhardy</dc:creator><description>As someone else mentioned, it would be better to do unbuffered IO: it's a waste to fill up the cache with two copies of the same data, espescially with a large file which will page everything else out to make room. Explorer has a nasty tendency to do this while copying large files.&lt;br&gt;&lt;br&gt;Why even bother with any seperate threads? The main thread is going to wait until the whole operation completes anyways, so why not have it create and wait on a completion port for itself? There'd be no more thread synchronization issues. I think a completion port would be a much better solution for this.&lt;br&gt;&lt;br&gt;unbufcp1.c from the platform SDK examples has an example of this, although it corrupts files without modification. unbufcp2.c is the same thing, but it uses multiple threads. It's not faster. (at least not on my machine)&lt;br&gt;&lt;br&gt;Also, according to the comments in unbufcp1.c, writes that cause file extention are always synchronous, so it extends the file before hand.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370071</link><pubDate>Wed, 09 Feb 2005 22:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370071</guid><dc:creator>Dean Harding</dc:creator><description>My understanding was that you only use WT_EXECUTEINIOTHREAD when you need your thread to wait in an alertable state, and not at other times (because non-IO threads are more &amp;quot;efficient&amp;quot;).  Since the code doesn't need to wait in an alertable state, then WT_EXECUTEINIOTHREAD isn't needed.&lt;br&gt;&lt;br&gt;Also, sequential access to a file is always going to be faster than random access.  You're basically taking what is a sequential read and sequential write, and turning them into random reads and writes.  And unless you're copying between separate physical disks, then the read/write operations will be serialized by the disk anyway so there's not point multi-threading it.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370085</link><pubDate>Wed, 09 Feb 2005 23:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370085</guid><dc:creator>Larry Osterman</dc:creator><description>Mike: Exactly - for normal sized files, we never generate enough load to increase the thread count to a value higher than 1.  Which defeats the entire purpose of queuing these to a worker thread.&lt;br&gt;&lt;br&gt;Dean: You're right.  That's a bug, although not critical (I suspect that the owner of the thread pool APIs might disagree with me though :))</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370108</link><pubDate>Wed, 09 Feb 2005 23:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370108</guid><dc:creator>B.Y.</dc:creator><description>Since the objective here is to speed up file copy, you should copy sparse files sparsely.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370135</link><pubDate>Thu, 10 Feb 2005 00:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370135</guid><dc:creator>Anon</dc:creator><description>Larry Osterman, the non-throwing forms of 'new' are the placement forms which accept a nothrow_t.&lt;br&gt;&lt;br&gt;I understand that you might not be familiar with the engineering disciplines that exceptions require and might have reservations about the code generation with some compilers, and in fact, I'm impressed that you admit your inabilities and prejudices. Nevertheless, I consider it better to say &amp;quot;I've called set_new_handler&amp;quot; or &amp;quot;This is not standard C++&amp;quot; rather than &amp;quot;I don't like exceptions so I ignored them like a college student&amp;quot; (or whatever you came out with earlier).</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370271</link><pubDate>Thu, 10 Feb 2005 05:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370271</guid><dc:creator>Phaeron</dc:creator><description>Hmm... I'd think that even if this code could successfully do overlapped I/O with multiple threads, there'd be a danger of hitting the I/O memory lock limit and getting spurious failures because there is no hard bound on the number of simultaneous threads (and thus pending requests).&lt;br&gt;</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370352</link><pubDate>Thu, 10 Feb 2005 09:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370352</guid><dc:creator>Tom M</dc:creator><description>Practically the entire thread function would have to be wrapped in critical sections, which would seem to defeat the object of shooting off worker threads to do the job for you. My reading of this is that part of the problem is that WriteFile will advance the file pointer by the number of bytes writen, and the next write operation will then continue from there. Because of the gap between setting the write pointer (and read pointer for that matter), and the actual read/write operation, there is a chance that reading and writing will be to and from random sections of the file, thus corrupting the file.</description></item><item><title>re: What's wrong with this code, part 9 - File Copy</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#370527</link><pubDate>Thu, 10 Feb 2005 17:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:370527</guid><dc:creator>Larry Osterman</dc:creator><description>Anon, actually that's not quite true.  According to MSDN:&lt;br&gt;If the request is for zero bytes of storage, operator new returns a pointer to a distinct object (that is, repeated calls to operator new return different pointers). If there is insufficient memory for the allocation request, operator new returns NULL or throws an exception (see The new and delete Operators for more information). &lt;br&gt;&lt;br&gt;Beginning in Visual C++ .NET 2002, the CRT's new function (in libc.lib, libcd.lib, libcmt.lib, libcmtd.lib, msvcrt.lib, and msvcrtd.lib) will continue to return NULL if memory allocation fails. However, the new function in the Standard C++ Library (in libcp.lib, libcpd.lib, libcpmt.lib, libcpmtd.lib, msvcprt.lib, and msvcprtd.lib) will support the behavior specified in the C++ standard, which is to throw a std::bad_alloc exception if the memory allocation fails.&lt;br&gt;&lt;br&gt;So the operator new that's used by default doesn't throw unless you include #include &amp;lt;new&amp;gt; in your code.&lt;br&gt;&lt;br&gt;And Anon, I DO understand about the engineering disciplines that exceptions require.  And I've very carefully considered them.&lt;br&gt;&lt;br&gt;And I feel quite strongly that is is significantly harder to generate correct code in the presence of exceptions than it is to generate correct code in the presence of deterministic failure modes.  I'm not alone in this respect, there are many other senior Microsoft people (Raymond Chen, Michael Grier for example) who also feel this way.&lt;br&gt;&lt;br&gt;Internally the &amp;quot;exceptions vs error codes&amp;quot; debate comes up about every two or three months, and at the end, boths sides agree to disagree - the exception people believe that the difficulty of writing correct code isn't as important as the benefits of having the ability to provide additional information about failures, and the error code people believe that it's more important to be able to write verifiably correct code.&lt;br&gt;&lt;br&gt;I stand with the error code people.&lt;br&gt;</description></item><item><title>Concurrency, Part 2 - Avoiding the problem</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#373463</link><pubDate>Tue, 15 Feb 2005 23:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:373463</guid><dc:creator>Larry Osterman's WebLog</dc:creator><description /></item><item><title>Concurrency, Part 2 - Avoiding the problem</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#373615</link><pubDate>Wed, 16 Feb 2005 00:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:373615</guid><dc:creator>Larry Osterman's WebLog</dc:creator><description /></item><item><title>Help regarding Copy File Performance | keyongtech</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#9361816</link><pubDate>Thu, 22 Jan 2009 05:56:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9361816</guid><dc:creator>Help regarding Copy File Performance | keyongtech</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://www.keyongtech.com/2548309-help-regarding-copy-file-performance"&gt;http://www.keyongtech.com/2548309-help-regarding-copy-file-performance&lt;/a&gt;&lt;/p&gt;
</description></item><item><title> Larry Osterman s WebLog What s wrong with this code part 9 File Copy | Insomnia Cure</title><link>http://blogs.msdn.com/larryosterman/archive/2005/02/09/369885.aspx#9710786</link><pubDate>Tue, 09 Jun 2009 01:48:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9710786</guid><dc:creator> Larry Osterman s WebLog What s wrong with this code part 9 File Copy | Insomnia Cure</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://insomniacuresite.info/story.php?id=2329"&gt;http://insomniacuresite.info/story.php?id=2329&lt;/a&gt;&lt;/p&gt;
</description></item></channel></rss>