Archive

Archive for the ‘tip’ Category

Move IMAP Personal Folder File in Outlook 2007

December 3rd, 2009 1 comment

This post is kind-of off-topic concerning my main blog topic area, but 1) it has been a while since my last post and 2) the topic has caused me a headache, so I decided to blog it.

Besides my own mailbox, hosted in Exchange, I often load other IMAP mailboxes in the same Outlook profile. IMAP tries to work in the same way as Exchange (it leaves all messages on the server and – if properly configured – also stores sent items there). So far, so good.

Here comes the nasty part: reading this post, you probably faced the same problem as I did. Moving the data file from your personal folder to another folder is not just as easy as when working with a POP3 mailbox – when moving, Outlook just keeps generating a new PST file when you delete it. Besides, there is no option such as ‘move mailbox’.

Just a note before you read on: you cannot reload an ‘IMAP backup PST file’. If you are trying to do anything like that, just stop since you will fail reaching your goal. Therefore, backing up IMAP folders does not make any sense.

After the misery from the previous paragraph I can give you some relief: it is not hard to move the PST file. It’s just the ‘workflow’ that matters:

  1. Close Outlook.
  2. Open the Mail item in Control Panel.
  3. Open the profile to work on and go to its data file(s).
  4. Locate the original data file location.
  5. Let the data file window stay open!
  6. Move the PST file. Don’t rename or point to another file – silly, yes I know – or an empty PST file will definitely be created in the original folder.
  7. Double click the data file in the window you should have left open. It shows you an error message and after clicking that one away, you can select the new location of your mailbox.
  8. Close all mail windows.
  9. Open Outlook.
  10. [Check the original PST file folder for possible newly created mailbox files - if so, you made a mistake following my guidelines Move IMAP Personal Folder File in Outlook 2007 icon wink .]
  11. You’re done!

Cheers!

Categories: mail, tip

The using statement and XmlReader.Create

September 7th, 2009 Comments off

Are you also fond of using the using statement (e.g. when dealing with streams)? I am, since it kind-of guarantees me that streams are closed when I think they should be closed, even if I do not specify the Dispose() command. You probably noticed the ‘kind-of guarantee’ part. You are right, this is not always the case. It took me a while to find out the the following is not going to work as smooth as expected:

using (var reader = XmlReader.Create(File.Open(fileName, FileMode.Open)))
    { ... }

You probably wonder what’s the problem of the code printed above. I don’t see it too, however, I know there is a problem related to this code. The problem lies in the Create overload used in the example code. It uses default XmlReaderSettings. Unfortunately, this settings do not include having the CloseInput property set to true. You can do the math: no closed file at all! That’s a guarantee for having troubles on the file ‘being in use already’.

The solution to this problem is quite simple:

using (XmlReader reader = XmlReader.Create(File.Open(path, FileMode.Open),
         new XmlReaderSettings { CloseInput = true })) { ... }

How can we call this? A ‘bug’? No, at least not technically spoken. Since the XmlReader creates the stream, it should close it too. The case is, you should not expext it knowing the using statement as most people know it (fail-proofing your code). Since I know this, I am a little bit scared about using using statements without calling the stream’s constructor. You can do so, but be sure it does what you expect it to do… In my opinion, the using statement still remains very helpful, please I do not consider it being as perfect as I thought it to be for years The using statement and XmlReader.Create icon wink

Categories: .NET, bug, c#, tip, visual studio 2008

Calculate age (for instance, on reference data)

September 2nd, 2009 Comments off

Now and then, I have to calculate ages (for instance, on a reference date). The method to calculate ages in .NET is pretty simple, although it can be ‘a pain in the ass’ to find out how simple it should have been Calculate age (for instance, on reference data) icon smile … Enjoy the code Calculate age (for instance, on reference data) icon smile !

public static class DateTimeHelper
{
    public static int CalculateAge(DateTime birthday)
    {
        return CalculateAge(DateTime.Now, birthday);
    }

    public static int CalculateAge(DateTime referenceDate, DateTime birthday)
    {
        // calculate age in years on the given reference date.
        var comparisonDate = new DateTime(birthday.Year, referenceDate.Month, referenceDate.Day);

        return (comparisonDate.Date < birthday.Date)
                      ? referenceDate.Year - birthday.Year - 1
                      : referenceDate.Year - birthday.Year;
    }
}
Categories: .NET, c#, datetime, tip

How to detect installed CLR versions and how they are used…

June 2nd, 2009 2 comments

It has been a while since I posted anything on my blog. Sorry for keeping you on hold How to detect installed CLR versions and how they are used... icon wink ! I think the blog will be filled with some information shortly, since I am still overthinking all the great stuff I saw on Tech-Ed North America a couple of weeks ago (first I had to overcome the jetlag, then the weather in The Netherlands, etc. etc. How to detect installed CLR versions and how they are used... icon smile ). Enough nonsense for now!

While attending a session by Scott Hanselman on everything new in .NET 4.0 he showed a wonderful small tip, not only useful for the few of us already working on Visual Studio 2010: when working in the VS.NET Command Prompt, there is a small but useful command called ‘CLRVER’. It shows all .NET versions installed on your computer. Also, as an addition to this command, you can show active runtime processes using the -all switch. Nice piece of code! Enjoy!

TFS command line (tf.exe)

March 27th, 2009 13 comments
Now and then in my life as a lead developer/architect, I have to cope with TFS the ‘hard’ way: the user interface is not always as complete as one would want it to be. One of the greatest tools Microsoft has delivered us is tf.exe, a command line tool to do almost everything impossible with the user interface. However, tf.exe comes with one big draw-back. It does not offer a complete help. Just minutes ago I discovered the documentation I need at one Microsoft guy’s (Noah Coad’s) blog (http://blogs.msdn.com/noahc/archive/2007/01/22/real-tfs-command-line-help.aspx).
 
Just to be sure the help will never disappear, I printed the entire help file below, as well as did I include the help documents as text files.
 
I hope this helps you too.
 
tfhelp.txt (120 characters)
tfhelp.txt (80 characters)
 

COMMANDS

Add        tf add itemspec [lock:none|checkin|checkout] [/type:filetype]

              [/noprompt] [/recursive]

Branch     tf branch olditem newitem [/version:versionspec] [/noget] [/lock]

              [/noprompt] [/recursive]

Branches   tf branches [/s:servername] itemspec

Changeset  tf changeset [/comment:comment|@commentfile] /s:servername

              [/notes:("NoteFieldName"="NoteFieldValue"|@notefile)] [/noprompt]

              ([/latest]|changesetnumber)

Checkin    tf checkin [/author:authorname] [/comment:("comment"|@commentfile)]

              [/noprompt]

              [/notes:("Note Name"="note text"|@notefile)]

              [/override:reason|@reason] [/recursive] filespec …]

Checkout   tf checkout|edit [/lock:(none|checkin|checkout)] [/recursive]

              [/type:encoding] itemspec

Configure  tf configure pathtoproject /server:servername

Delete     tf delete [/lock:(none|checkin|checkout)] [/recursive] itemspec

Difference tf difference itemspec [/version:versionspec] [/type:filetype]

              [/format:(visual|unix|ss)] [/ignorespace]

              [/ignoreeol] [/ignorecase] [/recursive] [/options:"options"]

           tf difference itemspec itemspec2 [/type:filetype]

              [/format:(visual|unix|ss)] [/ignorespace] [/ignoreeol]

              [/ignorecase] [/recursive] [/options:"options"]

           tf difference [/shelveset:[shelvesetowner;]shelvesetname]

              shelveset_itemspec [/server:serverURL]

              [/type:filetype] [/format:(visual|unix|ss)] [/ignorespace]

              [/ignoreeol] [/ignorecase] [/recursive] [/options:"options"]

           tf difference /configure

Dir        tf dir [/s:servername] itemspec [/version:versionspec] [/recursive]

              [/folders] [/deleted]

Get        tf get itemspec [/version:versionspec] [/all] [/overwrite] [/force]

              [/preview] [/recursive] [/noprompt]

Help       tf help commandname

History    tf history [/s:servername] itemspec [/version:versionspec]

              [/stopafter:number] [/recursive]

              [/user:username] [/format:(brief|detailed)] [/slotmode]

Label      tf label [/s:servername]  labelname@scope [/owner:ownername]

              itemspec [/version:versionspec]

              [/comment:("comment"|@commentfile)] [/child:(replace|merge)]

              [/recursive]

           tf label [/s:servername] [/delete] labelname@scope

              [/owner:ownername] itemspec [/version:versionspec]

              [/recursive]

Labels     tf labels [/owner:ownername] [/format:(brief|detailed)]

              [/s:servername] [labelname]

Lock       tf lock itemspec /lock:(none|checkout|checkin)

              [/workspace:workspacename] [/server:serverURL] [/recursive]

              [/noprompt]

Merge      tf merge  [/recursive] [/force] [/candidate] [/discard]

              [/version:versionspec]

              [/lock:none|checkin|checkout] [/preview] [/baseless] [/nosummary]

              source destination

Merges     tf merges [/s:servername] destination [/recursive]

Permission tf permission [/allow:(* |perm1[,perm2,…]]

              [/deny:(*|perm1[,perm2,...])]

              [/remove:(* |perm1[,perm2,...])]

              [/inherit:yes|no] [/user:username1[,username2,…]] [/recursive]

              [/group:groupname1[,groupname2,...]]

              [/server:servername] itemspec

Properties tf properties [/recursive] itemspec

Rename     tf rename [/lock:(none|checkout|checkin)] olditem newitem

Resolve    tf resolve itemspec [auto:(AcceptMerge|AcceptTheirs|AcceptYours)]

              [/preview]

              [(/overridetype:overridetype | /converttotype:converttype)]

              [/recursive]

Shelve     tf shelve [/move] [/replace] [/comment:(@commentfile|"comment")]

              [/recursive] shelvesetname[;owner] filespec

           tf shelve /delete [/server:serverURL] shelvesetname[;owner]

Shelvesets tf shelvesets [/owner:ownername] [/format:(brief|detailed)]

              [/server:serverURL] shelvesetname

Status     tf status itemspec [/s:servername]

              ([/workspace:workspacename[;workspaceowner]] |

              [/shelveset:shelvesetname[;shelvesetowner]])

              [/format:(brief|detailed)] [/recursive] [/user:(*|username)]

Undelete   tf undelete [/noget] [/lock:(none|checkin|checkout)]

              [/newname:name] [/recursive] itemspec[;deletionID]

Undo       tf undo [/workspace:workspacename   [;workspaceowner]]

              [/s:servername] [/recursive] itemspec

Unlabel    tf unlabel [/s:servername] [/recursive] labelname itemspec

Unshelve   tf unshelve [/move] [shelvesetname[;username]] itemspec

View       tf view [/s:servername] [/console] [/noprompt] itemspec

              [/version:versionspec]

WorkFold   tf workfold localfolder

           tf workfold [/workspace: workspacename]

           tf workfold [/s:servername] [/workspace: workspacename]

              repositoryfolder

           tf workfold [/map] [/s:servername] [/workspace: workspacename]

              repositoryfolder|localfolder

           tf workfold /unmap [/s:servername] [/workspace: workspacename]

              [/recursive] (repositoryfolder|localfolder)

           tf workfold /cloak (repositoryfolder|localfolder)

              [/workspace: workspacename] [/s:servername]

           tf workfold /decloak (repositoryfolder|localfolder)

              [/workspace:workspacename] [/s:servername]

Workspace  tf workspace /new [/noprompt]

              [/template:workspacename[;workspaceowner]]

              [/computer:computername] [/comment:("comment"|@commentfile)]

              [/s:servername]

           tf workspace /delete [/s:servername]

              workspacename[;workspaceowner]

           tf workspace [/s:servername] [/comment:comment]

              [/newname:workspacename] workspacename[;workspaceowner]

Workspaces tf workspaces [/owner:ownername] [/computer:computername]

              [/s:servername] [/format:(brief|detailed)]

              [/updateUserName:oldusername]

              [/updateComputerName:oldcomputername] workspacename

 

ITEMSPECS

  Can contain wildcards *, ? and #

  Can contain relative path parts . and ..

  Can reference file system or UNC paths mapped to a workspace or server

  paths (which start with $/). You can usually specify more than one

  file separated by spaces for an itemspec (useful for edit, add, delete

  commands)

 

VERSIONSPECS

  Date/Time         Dmm/dd/yyyy

  Changeset number  Cnnnnnn

  Label             Llabelname

  Latest version    T

  Workspace         Wworkspacename;workspaceowner

 

ALIASES

  /changeset  /G     /noprompt   /I

  /comment    /C     /owner      /O

  /computer   /M     /recursive  /R

  /delete     /D     /server     /S

  /force      /P     /slotmode   /X

  /format     /F     /template   /T

  /help       /?,/H  /user       /U

  /lock       /K     /version    /V

  /login      /Y     /workplace  /W

  /newname    /N